在python中构建不同的对

时间:2018-03-03 11:02:14

标签: python python-3.x combinations

productcode = ['apple','orange','melons'] # 1000+ more
pairs = []
count = 0
for xi,x in enumerate(productcode):
    del productcode[xi]
    for yi,y in enumerate(productcode):
        pc2 += 1
        p = (x,y)
        pairs.append(p)

print ("Number of distinct pairs:",pc2)

productcode包含超过一千个数据项:

apple

orange

grape

预期产出:

apple orange

apple grape

orange grape

嵌套的for循环只迭代列表中的一半项目(productcode),因此我的结果数量比我预期的少得多。谁能帮助解释我做错了什么,或者实际发生了什么?

2 个答案:

答案 0 :(得分:3)

itertools.combinations是一个很自然的选择。为避免重复,请先将colorPrimary转换为list。有两种类似的解决方案,具体取决于您是否需要订购结果。

<强>序

set

我不确定您需要哪种订单,因此我已按 子列表中的进行排序,每种情况下按字母顺序排列。

<强>无序

如果订单在任何地方都不重要,那么您需要使用from itertools import combinations productcode = ['apple', 'orange', 'grape'] res_lst = sorted(map(sorted, combinations(set(productcode), 2))) # [['apple', 'grape'], ['apple', 'orange'], ['grape', 'orange']] set项:

frozenset

这是因为res_set = set(map(frozenset, combinations(set(productcode), 2))) # {frozenset({'apple', 'orange'}), # frozenset({'grape', 'orange'}), # frozenset({'apple', 'grape'})} 项必须是不可变的; setfrozenset的不可变版本。这是测试一对是否在集合中的一种自然方式。例如:

set

另一种方法是使用一组按字母顺序排序的元组。

答案 1 :(得分:1)

您在迭代时修改集合。不好的主意。

cool datastructure that gets rid of duplicates

创建大量重复数据:

from itertools import combinations

# make all 2-length combinations of 1,2,3,1,2,3,4,5,3   
comb = list(combinations([ 1,2,3,1,2,3,4,5,3  ],2)) # works with strings as well
print(comb) 

输出:

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

使数据独一无二:

uniques = set(comb)
print(uniques)  

输出:

set([(1, 2), (3, 2), (1, 3), (3, 3), (4, 5), (3, 1), (1, 4), 
     (2, 4), (1, 5), (2, 3), (2, 1), (4, 3), (2, 2), (2, 5), 
     (5, 3), (3, 4), (1, 1), (3, 5)])

如果您需要所有combinations的内容,请事先将事情填入set以消除所有欺骗行为并通过combinations itertools.combinationsset创建combinations }。如果您在list上使用combinations,则会先创建不需要的set - 所以 combination ,然后 {{1来自它的

集合(和dicts)的缺点/捕获是它们需要不可变密钥 - 所以tuples很好,lists不是,strings可以正常工作。如果需要,您可以tuple(alist)