Python从二维列表中删除元素

时间:2016-03-25 16:55:06

标签: python arrays list max min

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

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)

这引起了我一些错误,我并不特别理解。我非常确定内部列表不是数组而是普通变量。但我仍然认为应该以某种方式从二维列表中删除min和max元素。 我的意思是我需要删除列表中最高和最低值的每个内部列表。 LF帮忙! 问候。

5 个答案:

答案 0 :(得分:11)

只是为了使用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]]

用于解决此问题的每个项目的一些阅读材料:

为了照顾重复,Padraic的this回答非常好。

答案 1 :(得分:3)

如果要删除所有匹配项,则必须找到min和max并从每个子列表中删除所有匹配项:

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)

即使您自己的逻辑工作并且您想要删除所有等于max的元素,它也无法使用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)

答案 2 :(得分:0)

尝试这种方法:

foreach innerlist:

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

答案 3 :(得分:0)

它应该像这样工作:

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] a [ to little
  2. maxV = 0仅在列表始终为正
  3. 时有效
  4. maxVminV应位于第一个循环内
  5. innerlist.remove(maxV)应为list.remove(maxV)
  6. 我还将innerList重命名为value

答案 4 :(得分:-1)

取消你的移除,将它们带出循环并且:

maxV = -10000000
minV = 10000000   # !!