Удаление определенных вложенных списков из вложенного списка на основе условия - PullRequest
1 голос
/ 06 ноября 2019

Итак, у меня есть вложенный список (назовем его A). Он имеет длину 2, и их следует рассматривать как отдельные списки. Я хочу перебрать эти 2 отдельно и удалить подсписки, которые не имеют одинаковую длину. Например, я хочу, чтобы мой вывод был таким же, как A, но с удаленным [['Заголовок таблицы]]], потому что он не такой же длины, как другие вложенные списки.

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']]]]

Ответы [ 2 ]

1 голос
/ 06 ноября 2019

Как это

[ 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]

Этот цикл решения два раза по всему списку, в зависимости от размеров списка это может быть ограничением.

0 голосов
/ 06 ноября 2019

Проверьте это. Он удаляет элемент, если его больше нет в списке.


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']]]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...