Удалить элемент из вложенных списков со смешанными структурами (списки и целые числа) в Python - PullRequest
4 голосов
/ 24 октября 2019

Рассмотрим списки:

assigned = [4,8]
matching = [['B', [4, 5, 6]], ['C', [7, 8, 9]]]

Я пытаюсь удалить данные целые числа с помощью следующего кода

for ii in range(len(assigned)):
    while any(assigned[ii] in x for x in matching):
        matching.remove(assigned[ii])

У меня есть две проблемы здесь. Первый - попасть во внутренние списки. Сейчас код ничего не делает, потому что нет соответствия.

Вторая проблема, я попробовал это:

t = ['B', [4, 5, 6]]
if any(4 in x for x in l2):

И в результате возникла ошибка:

if any(4 in x for x in l2):
TypeError: 'in <string>' requires string as left operand, not int

Есть ли способ добиться того, чтобы и то, и другое не превышало двух строк кода: найти совпадения во вложенных списках и удалить эти совпадения?

Ответы [ 2 ]

5 голосов
/ 24 октября 2019

Вот один из способов использования понимания вложенного списка:

matching = [[i[0], [j for j in i[1] if j not in assigned]] for i in matching]
print(matching)

Вывод:

[['B', [5, 6]], ['C', [7, 9]]]
1 голос
/ 24 октября 2019

Вот еще один подход с пониманием списка, если вы предпочитаете использовать .remove()

assigned = [4,8]
matching = [['B', [4, 5, 6]], ['C', [7, 8, 9]]]
[item[1].remove(x) for item in matching for x in item[1] if x in assigned]
print(matching)
# [['B', [5, 6]], ['C', [7, 9]]]

Выше приведена в основном версия понимания списка:

for item in matching:
    for x in item[1]:
        if x in assigned:
            item[1].remove(x)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...