仅保留列表的唯一实例,其唯一的区别是订单

时间:2013-11-27 04:39:01

标签: python python-2.7 set unique itertools

使用此代码:

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

我打印出所有唯一列表。然而,许多打印列表是唯一的,因为它们是不同顺序的相同元素。

我如何更改我的代码,以便我只打印一个列表,如果它尚未按照不同的顺序打印?

2 个答案:

答案 0 :(得分:1)

frozenset是可以删除的,并不关心其内容的顺序。只需为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)

答案 1 :(得分: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