Python пересекает два списка - PullRequest
       4

Python пересекает два списка

3 голосов
/ 02 сентября 2011

Я нашел это хорошее утверждение в уроке:

    for x,y in [(x,y) for x in listA for y in listB]:

Теперь, что касается меня, я понял, что эта оценка пройдет через listA и listB, а x - это значение списка A, а y - этозначение из списка B.Но в этом примере два списка имели одинаковую длину.Будет ли это утверждение также давать мне все пары, если один список длиннее другого, или мне нужно использовать другое утверждение?

Заранее спасибо.

Ответы [ 3 ]

13 голосов
/ 02 сентября 2011

Код вычисляет декартово произведение (itertools.product), а не zip, как вы предложили.

Например, если входные данные [1,2,3] и [4,5], результат будет:

(1,4)
(1,5)
(2,4)
(2,5)
(3,4)
(3,5)

Для сравнения, результат zip([1,2,3], [4,5]):

(1,4)
(2,5)

Как видите, zip (или itertools.izip ) отбрасывает дополнительные элементы в более длинном аргументе.

Его вариант itertools.izip_longest заменяет эти отсутствующие элементы произвольным значением. Например, iterttools.izip_longest([1,2,3], [4,5], 99) возвращает:

(1,4)
(2,5)
(3,99)
6 голосов
/ 02 сентября 2011

В этом примере будут получены все комбинации всех элементов в listA и listB.Думайте об этом как о написании

for x in listA:
    for y in listB:
        …
0 голосов
/ 09 октября 2012

Мне нравится добавлять ответ для Обхода двух списков одновременно.

alist = [1,2,3,4,5]
blist = [6,7,8,9,0]

for a,b in zip(alist,blist):
    print a,"+",b,'=',a+b

это выдаст примерно

1 + 6 = 7
2 + 7 = 9
3 + 8 = 11
4 + 9 = 13
5 + 0 = 5
...