Использование цикла по списку списка для фильтрации другого списка

avatar
GDog
1 июля 2021 в 18:11
50
2
-2

Даны следующие 2 списка:

list_1 = [[1, 2, 'ABC'], [2, 3, 'ABC']]
list_2 = ['ABC 1.csv', 'ABC 2.csv', 'ABC 3.csv', 'ABC 4.csv', 'ABC 5.csv']

Какой код можно написать, чтобы получить:

Желаемый результат:

list_3 = ['ABC 1.csv', 'ABC 2.csv', 'ABC 3.csv']

Моя попытка:

count = 0
while count < len(list_1):
    list_3 = [i for i in list_2 if str(list_1[int(count)][0]) in i or str(list_1[int(count)][1]) in i and list_1[int(count)][2] in i]
    count += 1
Источник
Jab
1 июля 2021 в 18:19
0

Почему вы получаете такие странные входные данные, не можете ли вы получить list_1 в более удобной форме?

Matthias
5 июля 2021 в 12:02
0

Поскольку вы не приняли ни один из ответов, не могли бы вы рассказать нам, чего, по вашему мнению, по-прежнему не хватает?

Ответы (2)

avatar
Matthias
1 июля 2021 в 18:25
0

Сначала создайте список wanted из list_1, содержащий все разрешенные записи. Затем возьмите каждую запись из list_2, которую вы найдете в списке wanted.

list_1 = [[1, 2, 'ABC'], [2, 3, 'ABC']]
list_2 = ['ABC 1.csv', 'ABC 2.csv', 'ABC 3.csv', 'ABC 4.csv', 'ABC 5.csv']

wanted = []
for n1, n2, prefix in list_1:
    wanted.append(f'{prefix} {n1}.csv')
    wanted.append(f'{prefix} {n2}.csv')

result = [entry for entry in list_2 if entry in wanted]
print(result)

У вас могут быть дубликаты в списке wanted, но это не имеет значения.


Еще более гибкий однострочник (обратите внимание на цифры в первой записи list_1):

list_1 = [[1, 2, 5, 'ABC'], [2, 3, 'ABC']]
list_2 = ['ABC 1.csv', 'ABC 2.csv', 'ABC 3.csv', 'ABC 4.csv', 'ABC 5.csv']
print([entry for entry in list_2 if entry in {f'{prefix} {n}.csv' for *numbers, prefix in list_1 for n in numbers}])

Это даст вам ['ABC 1.csv', 'ABC 2.csv', 'ABC 3.csv', 'ABC 5.csv']

avatar
Carlos
1 июля 2021 в 18:20
0

Вы можете попробовать что-то вроде этого:

list_1=[[1, 2, 'ABC'], [2, 3, 'ABC']]
list_2=['ABC 1.csv', 'ABC 2.csv', 'ABC 3.csv', 'ABC 4.csv', 'ABC 5.csv']

numbers = []
for l in list_1:
    if l[0] not in numbers:
        numbers.append(l[0])
    if l[1] not in numbers:
        numbers.append(l[1])
        
list_3 = []
for l in list_2:
    if int(l[4]) in numbers:
        list_3.append(l)
print(list_3)
Matthias
1 июля 2021 в 18:29
0

Этому не хватает некоторой гибкости. Используйте list_1=[[1, 2, 'ABC'], [2, 3, 'CDE']] или list_1=[[1, 2, 'AB'], [2, 3, 'AB']], и это решение внезапно перестанет быть решением.