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),因此我的结果数量比我预期的少得多。谁能帮助解释我做错了什么,或者实际发生了什么?
答案 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'})}
项必须是不可变的; set
是frozenset
的不可变版本。这是测试一对是否在集合中的一种自然方式。例如:
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.combinations
从set
创建combinations
}。如果您在list
上使用combinations
,则会先创建不需要的set
- 所以 combination
,然后 {{1来自它的。
集合(和dicts)的缺点/捕获是它们需要不可变密钥 - 所以tuples
很好,lists
不是,strings
可以正常工作。如果需要,您可以tuple(alist)
。