Python 从二维列表中删除元素

Python remove elements from two dimensional list

正在尝试从数组的二维列表中删除最小值和最大值。 我的代码:

myList = [[1, 3, 4], [2, 4, 4], [3, 4, 5]]
maxV = 0
minV = myList[0]0]
for list in myList:
   for innerlist in list:
      if innerlist > maxV:
         maxV = innerlist
      if innerlist < minV:
         minV = innerlist
   innerlist.remove(maxV)
   innerlist.remove(minV)
print(myList)

这让我犯了一些错误,我不是特别明白。我很确定 innerlist 不是数组而是普通变量。但我仍然认为应该有可能从二维列表中删除最小和最大元素。 我的意思是我需要在列表中的每个内部列表中删除最高值和最低值。 LF求助! 问候。

取消缩进您的删除,将它们从循环中取出并:

maxV = -10000000
minV = 10000000   # !!

只是为了展示一种使用 list comprehensionssorted 方法和 slicing:

的更简单的方法
d = [[1, 3, 4], [2, 4, 4], [3, 4, 5]]

n = [sorted(l)[1:-1] for l in d]

print(n)

# [[3], [4], [4]]

阅读 material 用于解决此问题的每个项目:

为了处理重复问题, Padraic 的回答做得很好。

试试这个方法:

foreach 内部列表:

  1. 对数组进行排序
  2. 删除第一个元素
  3. 删除最后一个元素

它应该像这样工作:

myList = [[1, 3, 4], [2, 4, 4], [3, 4, 5]]
for list in myList:
   maxV = list[0] #initialise them here
   minV = list[0] #because you look for max in list
   for value in list:
      if value> maxV:
         maxV = innerlist
      if value< minV:
         minV = innerlist
   list.remove(maxV) #remove from list
   list.remove(minV)
print(myList)

您的错误所在:

  1. minV = myList[0]0]一个[到一点
  2. maxV = 0 仅当列表始终为正时才有效
  3. maxVminV 应该在第一个循环内
  4. innerlist.remove(maxV) 应该是 list.remove(maxV)

我也将 innerList 重命名为 value

如果要删除所有出现的事件,则必须找到最小值和最大值并从每个子列表中删除所有出现的事件:

def remove(l):
    for sub in l:
        t = {min(sub), max(sub)}
        sub[:] = (ele for ele in sub if ele not in t)


l = [[1, 3, 4], [1, 2, 4, 4], [3, 4, 5]]

remove(l)

哪个会给你:

[[3], [2], [4]]

要一次找到最小值和最大值,您可以使用辅助函数:

def min_max(sub):
    # all numbers are > float("-inf") and < float("inf")
    mx, mn = float("-inf"), float("inf")
    for ele in sub:
        if ele < mn:
            mn = ele
        if ele > mx:
            mx = ele
    return {mn, mx}

def remove(l):
    for sub in l:
        # find min and max
        mn_mx = min_max(sub)
        # update sublist so all occurrences of either are removed
        sub[:] = (ele for ele in sub if ele not in mn_mx)

即使您自己的逻辑有效并且您想删除所有等于最大值的元素,使用 remove 也不起作用,因为它每次只会删除第一次出现的元素。

In [8]: l = [1,2,3,4,4]

In [9]: l.remove(4)

In [10]: l
Out[10]: [1, 2, 3, 4]

根据您的一条评论,您的子列表中似乎有字符串,与 int 相比会出错,如果字符串始终是第一个元素,您可以将其切掉:

   from itertools import islice

   def remove(l):
        for sub in l:
            sub = sub[1:]
            mn_mx = min_max(sub)
            sub[:] = (ele for ele in sub if ele not in mn_mx)