Удаление всего списка из списка списков - PullRequest
0 голосов
/ 11 января 2019

У меня есть список списков следующим образом:

g = [
    ["a","?","?","?","?","?","?"],
    ["?","b","?","?","?","?","?"],
    ["?","?","?","?","?","?","?"]
]

Я хочу перебрать этот список и удалить список, содержащий все «?», Который является последним списком в этом списке. Я пробовал pop (), del и несколько других операций, но пока ничего не работает.

Вот что я написал для этой части:

for x in g:
    if x.count("?") == 6:
        g.pop(g.index(x))

Не удаляет список, а удаляет одно "?" из последнего списка. Может кто-нибудь, пожалуйста, направьте меня сюда.

Ответы [ 6 ]

0 голосов
/ 11 января 2019

Вы также можете использовать filter с lambda функциями:

func = lambda x: x.count("?") != len(x)
new_g = list(filter(func, g))
0 голосов
/ 11 января 2019

Давайте воспользуемся пониманием списков, чтобы решить эту проблему -

all([True, True, True)] 
   True
all(True, True, False)
   False

Таким образом, мы сравниваем каждый элемент подсписков с '?', и, если они равны '?', мы возвращаем True и, наконец, применяем функцию all() к подспискам.

g_out = [i for i in g if all([j=='?' for j in i]) == False]
print(g_out)
    [['a', '?', '?', '?', '?', '?', '?'], ['?', 'b', '?', '?', '?', '?', '?']]
0 голосов
/ 11 января 2019

В случае, если понимание списка не очень ясно, как в ответах, которые вы получили, альтернатива может иметь эту форму;

l = [['a', '?'], ['?', '?']]

result = []
for i in l:
    if ('?' in i) and (set(i) == {'?'}):
        continue
    result.append(i)
0 голосов
/ 11 января 2019

Может быть, это поможет!

[x for i,x in enumerate(X) if ''.join(x).replace('?','')]

выход:

[['a', '?', '?', '?', '?', '?', '?'], ['?', 'b', '?', '?', '?', '?', '?']]
0 голосов
/ 11 января 2019

Попробуйте этот список понимания:

X = [["a","?","?","?","?","?","?"],["?","b","?","?","?","?","?"],["?","?","?","?","?","?","?"]]

print([l for l in X if l.count("?") == len(l)])

Выход:

[['a', '?', '?', '?', '?', '?', '?'], ['?', 'b', '?', '?', '?', '?', '?']]

В качестве дополнительного бонуса он в 2 раза быстрее, чем ответ @ heemayl.

0 голосов
/ 11 января 2019

Вы должны использовать set здесь:

In [152]: X = [["a","?","?","?","?","?","?"],["?","b","?","?","?","?","?"],["?","?","?","?","?","?","?"]]

In [153]: [l for l in X if set(l) != {"?"}]
Out[153]: [['a', '?', '?', '?', '?', '?', '?'], ['?', 'b', '?', '?', '?', '?', '?']]

set(l) получает уникальные значения списка и делает из него set, достаточно сравнить результирующий набор с {"?"}, так как вы хотите удалить список со всеми ? s.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...