копирование итераторов и создание неупорядоченного само декартова произведения - PullRequest
1 голос
/ 11 марта 2011

Скажем, у меня есть список, и я хочу создать список всех уникальных пар элементов без учета порядка.Один из способов сделать это:

mylist = ['W','X','Y','Z']
for i in xrange(len(mylist)):
    for j in xrange(i+1,len(mylist)):
        print mylist[i],mylist[j]
W X
W Y
W Z
X Y
X Z
Y Z

Я хочу сделать это с итераторами, я подумал о следующем, хотя это не кратко:даже не работает.Что является более питонным и эффективным способом сделать это, с помощью итераторов или zip и т. Д .?

Ответы [ 2 ]

7 голосов
/ 11 марта 2011

Это уже сделано и включено в стандартную библиотеку Python 2.6:

import itertools

mylist = ['W', 'X', 'Y', 'Z']
for pair in itertools.combinations(mylist, 2):
    print pair        # pair is a tuple of 2 elements

Мне кажется довольно питоническим; -)

Обратите внимание, что даже если вы вычисляете много комбинаций, функция combinations() возвращает итератор, чтобы вы могли сразу начать печатать их. См. документы .

Кроме того, вы ссылаетесь на результат как декартово произведение между списком и самим собой, но это не совсем правильно: декартово произведение будет иметь 16 элементов (4x4). Ваш вывод является подмножеством этого, а именно только 2-элементные комбинации (с повторением не допускается) значений списка.

0 голосов
/ 11 марта 2011

@ Кэмерон ответ правильный.

Я просто хотел отметить, что

for i in range(len(mylist)):
    do_something_to(mylist[i])

противно непифоновый; если ваша операция доступна только для чтения (ее не нужно хранить обратно в массиве), выполните

for i in mylist:
    do_something_to(i)

в противном случае

mylist = [do_something_to(i) for i in mylist]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...