2013-06-10 2 views
1

Я новичок в python и поставил это вместе из короткого класса на Python и некоторых Googling. Я пытаюсь сравнить два списка строк, чтобы увидеть, находятся ли все элементы списка A в списке B. Если какие-либо элементы не находятся в списке B, я хочу, чтобы он печатал уведомление.Как проверить, все ли элементы из одного списка находятся во втором списке на python?

List_A = ["test_1", "test_2", "test_3", "test_4", "test_5"] 
List_B = ["test_1", "test_2", "test_3", "test_4"] 

Код:

for item in List_A: 
    match = any(('[%s]'%item) in b for b in List_B) 
    print "%10s %s" % (item, "Exists" if match else "No Match in List B") 

Выход:

test_1 Нет Матч в списке В

test_2 Нет Матч в списке В

test_3 Нет Матч в списке В

test_4 Нет Матч в списке В

test_5 Нет Матч в списке В

Первые четыре должны соответствовать, но не делают, а пятый один не является правильным. Я понятия не имею, почему он не работает. Может ли кто-нибудь сказать мне, что я делаю неправильно? Любая помощь будет принята с благодарностью.

ответ

5
>>> '[%s]'%"test_1" 
'[test_1]' 

Вы проверяете, если «[test_1]» подстрока некоторой строки в list_B, и так далее.

Это должно работать:

for item in List_A: 
    match = any(item in b for b in List_B) 
    print "%10s %s" % (item, "Exists" if match else "No Match in List B") 

Но так как вы на самом деле не ищет подстроки, вы должны проверить in и больше ничего:

for item in List_A: 
    match = item in List_B 
    print "%10s %s" % (item, "Exists" if match else "No Match in List B") 

но вы можете просто использовать набор разницу:

print set(List_A) - set(List_B) 
0

Вы можете конвертировать List_B в комплект, так как наборы обеспечивают поиск O (1):

Хотя обратите внимание, что наборы позволяют хранить только хешируемые (неизменяемые) элементы. Если List_B содержит измененные элементы, то сначала преобразуйте их в неизменяемые элементы. Если это невозможно, сортируйте List_B и используйте модуль bisect, чтобы выполнить бинарный поиск по отсортированным List_B.

List_A = ["test_1", "test_2", "test_3", "test_4", "test_5"] 
List_B = ["test_1", "test_2", "test_3", "test_4"] 
s = set(List_B) 
for item in List_A: 
    match = item in s # check if item is in set s 
    print "%10s %s" % (item, "Exists" if match else "No Match in List B") 

выход:

test_1 Exists 
test_2 Exists 
test_3 Exists 
test_4 Exists 
test_5 No Match in List B 
0

Просто используйте простой для цикла:

List_A = ["test_1", "test_2", "test_3", "test_4", "test_5"] 
List_B = ["test_1", "test_2", "test_3", "test_4"] 
for i in List_A: 
    print "{:>10} {}".format(i, "Exists" if i in List_B else "No Match in List B") 
0
List_A = ["test_1", "test_2", "test_3", "test_4", "test_5"] 
List_B = ["test_1", "test_2", "test_3", "test_4"] 

for item in List_A: 
    match = any((str(item)) in b for b in List_B) 
    print "%10s %s" % (item, "Exists" if match else "No Match in List B") 

выход будет

test_1 Exists 
test_2 Exists 
test_3 Exists 
test_4 Exists 
test_5 No Match in List B 
Смежные вопросы