2013-11-27 1 views
2

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

from itertools import product 

list1 = ['Gabe', 'Taylor', 'Kyle', 'Jay'] 
list2 = ['Gabe', 'Taylor', 'Kyle', 'Jay', 'James', 'John', 'Tyde','Chris', 'Bruno', 'David'] 
list3 = ['Gabe', 'Taylor', 'Kyle', 'Jay', 'James', 'John', 'Tyde','Chris', 'Bruno', 'David'] 
list4 = ['Kyle', 'James', 'John', 'Tyde','Bruno', 'Drew', 'Chris'] 
list5 = ['James', 'John', 'Brendan','Tim', 'Drew' ] 

FinalList = [] 

for x in product(list1, list2, list3, list4, list5): 
    # check for duplicates 
    if len(set(x)) == 5: 
     FinalList.append(x) 

# to print 
for x in FinalList: 
    print x 

распечатать все уникальные списки. Однако многие печатные списки уникальны только потому, что они являются одними и теми же элементами в другом порядке.

Как я могу изменить свой код, чтобы печатать список только в том случае, если он еще не был напечатан просто по заказу?

+0

еще раз взглянуть на ответы там, я уже отправил правильный ответ в том числе то, что вы просите здесь ... –

+0

'product' это простой способ, чтобы написать это, но это не очень эффективно. 'product' не может воспользоваться возможностью, чтобы закоротить петли. –

ответ

1

frozenset hashable и не заботится о порядке его содержимого. Просто используйте набор, а не список для final_data и записей с одинаковыми именами в разных заказах будут соединялись в одну запись в final_data:

final_data = set() 
for x in product(list1, list2, list3, list4, list5): 
    datum = frozenset(x) 
    if len(datum) == 5: 
     final_data.add(datum) 
+0

>>> isinstance (set(), collections.Hashable) False –

+0

@Guy - * chuckles *, который кусает меня каждый раз ... и там я был, счастливо добавляя данные в набор 'final_data'. Я обновил свой ответ, чтобы использовать 'frozenset'. Благодаря! –

1

Вместо того, чтобы проверять размер набора, как вы делаете, магазин каждый из них, также в наборе (он делает поиск простым).

Тогда проверьте, знаете ли вы, что вы уже знаете set(x); если вы это сделаете, пропустите его, а затем поместите в набор известных наборов.

Чтобы сохранить набор в наборе, вы должны сделать внутренний набор неизменным, используя frozenset вместо set.

Рабочий код:

from itertools import product 

list1 = ['Gabe', 'Taylor', 'Kyle', 'Jay'] 
list2 = ['Gabe', 'Taylor', 'Kyle', 'Jay', 'James', 'John', 'Tyde','Chris', 'Bruno', 'David'] 
list3 = ['Gabe', 'Taylor', 'Kyle', 'Jay', 'James', 'John', 'Tyde','Chris', 'Bruno', 'David'] 
list4 = ['Kyle', 'James', 'John', 'Tyde','Bruno', 'Drew', 'Chris'] 
list5 = ['James', 'John', 'Brendan','Tim', 'Drew' ] 



def FindUniques(*lists): 
    already_seen = set() 
    result = [] 
    for x in product(*lists): 
     icicle = frozenset(x) 
     if icicle not in already_seen: 
      result.append(x) 
      already_seen.add(icicle) 
    return result 

final_list = FindUniques(list1, list2, list3, list4, list5) 

# make sure that each element in final_list, independent of elemet order, is unique 
assert len(final_list) == len(set(tuple(sorted(list(x))) for x in final_list)) 

# to print 
for x in final_list: 
    print x