Python - Сравните два списка в понимании - PullRequest
4 голосов
/ 14 апреля 2011

Я пытаюсь понять, как работает понимание.

Я бы хотел просмотреть два списка и сравнить каждый из них, чтобы найти различия. Если одно или несколько слов отличаются, я хотел бы напечатать это слово.

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

Ответы [ 3 ]

11 голосов
/ 14 апреля 2011

Делать это в «одной хорошей строке кода» - это код гольфа, и он вводит в заблуждение. Вместо этого сделайте его читабельным.

for a, b in zip(list1, list2):
    if a != b:
       print(a, "is different from", b) 

Это ничем не отличается от этого:

[print(a, "is different from", b) for a, b in zip(list1, list2) if a!=b]

За исключением того, что расширенную версию легче читать и понимать, чем понимать.

10 голосов
/ 14 апреля 2011

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

list_1 = [1, 2, 3, 4, 5, 6]
list_2 = [1, 2, 3, 0, 5, 6]

# Print all items from list_1 that are not in list_2 ()
print(*[item for item in list_1 if item not in list_2], sep='\n')

# Print all items from list_1 that differ from the item at the same index in list_2
print(*[x for x, y in zip(list_1, list_2) if x != y], sep='\n')

# Print all items from list_2 that differ from the item at the same index in list_1
print(*[y for x, y in zip(list_1, list_2) if x != y], sep='\n')
3 голосов
/ 14 апреля 2011

Если вы хотите сравнить два списка для различий, я думаю, что вы хотите использовать set.

s.symmetric_difference(t)   s ^ t   new set with elements in either s or t but not both

пример:

>>> L1 = ['a', 'b', 'c', 'd']
>>> L2 = ['b', 'c', 'd', 'e'] 
>>> S1 = set(L1)
>>> S2 = set(L2)
>>> difference = list(S1.symmetric_difference(S2))
>>> print difference
['a', 'e']
>>> 

однострочная форма?

>>> print list(set(L1).symmetric_difference(set(L2)))
['a', 'e']
>>> 

, если вы действительно хотите использовать понимание списка:

>>> [word for word in L1 if word not in L2] + [word for word in L2 if word not in L1]
['a', 'e']

гораздо менее эффективно по мере увеличения размера списков.

...