【问题标题】:Python remove elements from two dimensional listPython从二维列表中删除元素
【发布时间】:2016-07-13 11:14:25
【问题描述】:

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

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帮忙! 问候。

【问题讨论】:

  • 重复项呢?例如,操作后中间列表是否应该为空,因为有 2 个“高”值?
  • innerlist 不是列表;它是一个整数。 myListlist 是您拥有的唯一列表。

标签: python arrays list max min


【解决方案1】:

只是为了展示使用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 回答做得很好。

【讨论】:

  • 但是 4 等于最大值
  • 非常感谢!如果我的数组以字符串元素开头,并且我已经阅读过有关排序的内容,那么还有一件事,我知道(假设有 list d = [["xa",1, 3, 4], [" la",2, 4, 4], ["ta",3, 4, 5]]) n = [sorted(l)[2:-1] for l in d] i> 应该取自数组中的第二个元素,但它仍然让我感到错误,似乎他仍在尝试对字符串进行排序:(
  • @KarolisŠiaulys,如果是,您正在对排序列表进行切片而不是原始列表。 2:-1 也从第三个而不是第二个开始,在 python2 中,字符串将被排序到列表的末尾,所以当你 sorted(l)[2:-1] 时你仍然有最大值并且丢失了两个最低的整数,如果你想删除字符串和最大值使用sorted(l)[1:-2],您还应该知道,使用python 3进行排序或任何比较都会导致unorderable types错误,因为您无法将字符串与int进行比较
【解决方案2】:

如果你想删除所有出现,你必须找到最小值和最大值并从每个子列表中删除所有出现:

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]

根据您的一个 cmets,您的子列表中似乎有字符串,与 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)

【讨论】:

    【解决方案3】:

    试试这个方法:

    foreach 内部列表:

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

    【讨论】:

      【解决方案4】:

      它应该像这样工作:

      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

      【讨论】:

        【解决方案5】:

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

        maxV = -10000000
        minV = 10000000   # !!
        

        【讨论】:

        • 如果你想从一个整数中删除一个值,取消缩进将不起作用。将 minV 设置为第一个元素也有效,并且大 - 和 + 值不提供安全性。你应该改用sys.maxint
        猜你喜欢
        • 2017-06-25
        • 1970-01-01
        • 2018-11-20
        • 2022-09-23
        • 2018-09-30
        • 1970-01-01
        • 2021-07-25
        • 1970-01-01
        相关资源
        最近更新 更多