【问题标题】:Removing certain sublists from a nested list based on a condition根据条件从嵌套列表中删除某些子列表
【发布时间】:2019-11-06 00:07:11
【问题描述】:

所以,我有一个嵌套列表(我们称之为 A)。它的长度为 2,应将它们视为单独的列表。我想分别遍历这两个,并删除长度不相等的子列表。例如,我希望我的输出与 A 相同,但删除了 [['Table heading']],因为它与其他嵌套列表的长度不同。

A=[[[['1'], ['2'], ['3'], ['4']],
  [['x'],['y'],['z'],['w']],
  [['a'],['b'],['c'],['d']],
  [['11'], ['22'], ['33'], ['44']]],
  [[['Table heading']],
  [['A'], ['B'], ['C'], ['D']],
  [['X'], ['Y'], ['Z'], ['W']],
  [['1'], ['2'], ['3'], ['4']]]]

 output=[[[['1'], ['2'], ['3'], ['4']],
  [['x'],['y'],['z'],['w']],
  [['a'],['b'],['c'],['d']],
  [['11'], ['22'], ['33'], ['44']]],
  [[['A'], ['B'], ['C'], ['D']],
  [['X'], ['Y'], ['Z'], ['W']],
  [['1'], ['2'], ['3'], ['4']]]]

【问题讨论】:

  • 什么规则控制什么被删除?例如,为什么不保留表格标题,因为其余部分的长度不等于它的长度......如果 everything 的长度不同会发生什么?
  • O_O 你能把这个例子简化一下吗
  • 删除表格标题的原因是因为它与其他的长度不同,所有其他的长度为4,而表格标题的长度为1
  • @Mel 当然......但为什么不是相反呢?有人可能会争辩说,表标题应该保留,因为它的长度为 1,而所有其他的长度都不是 1,所以应该删除......所以必须有一些标准?例如,它们的长度都是 4 还是不能是长度 1...如果最后一行是 [['1'], ['2'], ['3'], ['4'], ['5']]A[1] 会发生什么?
  • @Mel 领带呢?如果有 2 行 2 列,2 行 4 列......应该怎么办?

标签: python list nested


【解决方案1】:

这样

[ y for x in A for y in x if len(y) == 4]

或以可读的格式。

out = []
for inner in A:
     for inner_inner in inner:
          if len(inner_inner) == 4:
               out.append(inner_inner)

如果你不知道内部列表的大小,但你知道只有一个列表大小不匹配,你可以这样做。

out = []
for inner in A:
     for inner_inner in inner:
         inner_size = len(inner_inner) 
         try:
             if inner_size == previous_size:
                 out.append(inner_inner)
          except NameError:
                  previous_size = inner_size
                  out.append(inner_inner)

这个有一个默认值,如果要删除第一个 inner_inner 元素,则将删除整个列表元素而不是第一个元素。

或者像这样

from collections import Counter

size = Counter([ len(y) for x in A for y in x ]).most_common(1)[0][0]
[ y for x in A for y in x if len(y) == size]

此解决方案会在整个列表中循环两次,具体取决于列表大小,这可能是一个限制。

【讨论】:

  • 谢谢你,但这是假设的例子,我知道内部的 len,我只想要 len=4 的子列表。但是我将如何设置 len programiticlaly?
  • A=[[[['1'], ['2'], ['3'], ['4']], [['x'],['y'] ,['z'],['w']], [['a'],['b'],['c'],['d']], [['11'], ['22 '], ['33'], ['44']]], [[['表标题']], [['A'], ['B'], ['C']], [[' X'], ['Y'], ['Z']], [['1'], ['2'], ['3']]]] 如何分别确定每个的长度,例如,最常见的长度是第一个表中的4,第二个表中的3。所以我想要每个表中最常见的长度。
  • 根据您的建议,如果表的长度不同,我会这样处理: A_new=[] for i in range(len(A)): Size=Counter([len( y) for y in A[i]]).most_common(1)[0][0] new=[num for num for A[i] if len(num)==Size] A_new.append(new)跨度>
  • @Mel 更新您的帖子并在其中添加您的评论,格式将更易于阅读。
【解决方案2】:

看看这个。它会删除元素,除非它们不再是列表。


def  delete_odd(A):
    if isinstance(A[0],list)==False:
        return
    def delete_elem(a,if_not):
        print(a,'  ',if_not,'   ')

        i = 0
        while i<len(a):
            if len(a[i])!=if_not:
                del a[i]
            else:
                i+=1

    if len(A)<=2:
        pass
    else:
        n1 = len(A[0])
        n2 = len(A[1])
        n3 = len(A[2])
        if n1==n2:
            n = n1
        elif n2==n3:
            n = n2

        delete_elem(A,if_not=n)
    i = 0
    while i<len(A):
        delete_odd(A[i])
        i+=1




A = [[[['1'], ['2'], ['3'], ['4']],
  [['x'],['y'],['z'],['w']],
  [['a'],['b'],['c'],['d']],
  [['11'], ['22'], ['33'], ['44']]],
  [[['Table heading']],
  [['A'], ['B'], ['C'], ['D']],
  [['X'], ['Y'], ['Z'], ['W']],
  [['1'], ['2'], ['3'], ['4']]]]
delete_odd(A)

print(A)
#output
[[[['1'], ['2'], ['3'], ['4']], [['x'], ['y'], ['z'], ['w']], [['a'], ['b'], ['c'], ['d']], [['11'], ['22'], ['33'], ['44']]], [[['A'], ['B'], ['C'], ['D']], [['X'], ['Y'], ['Z'], ['W']], [['1'], ['2'], ['3'], ['4']]]]

【讨论】:

    猜你喜欢
    • 2018-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-07
    • 1970-01-01
    • 2022-12-12
    • 1970-01-01
    相关资源
    最近更新 更多