如何解决如何在 Python 中列出列表的所有可能组合及其计数
大家好,这实际上是我在这里的第一个问题,所以如果我遗漏了一些信息,请告诉我。
我有一个包含数字的列表。我想要所有可能的组合以及这些组合在我的列表中出现的频率。组合应遵循与 itertools 组合库相同的规则。
我的第一次尝试是循环,它将组合保存在字典中,但我只完成了 2 个数字的长度。在那之后,我唯一的想法是一次又一次地循环,但我想这将花费很长时间,因为我的列表中将有超过 600 个元素。
我的第一次尝试是这样的:
def clean_dic(dic,sigma): #delete all canidates were frequency is smaller then sigma
dic = dict((k,v) for k,v in dic.items() if v >= sigma)
return dic
def create_canidate(seq,d_seq): #canidate creation with CdisT
for element in range(0,len(seq)):
s_check = set()
for skip in range (1,len(seq)-element):
number = tuple([seq[element],seq[element+skip]])
#get_freq
if number in d_seq and number not in s_check:
d_seq[number] += 1
elif number not in s_check and seq[element] in d_seq and seq[element+skip] in d_seq:
d_seq[number] = 1
s_check.add((seq[element],seq[element+skip]))
return d_seq
sequence = [1,2,3,4,1,1] #example sequence
#parameter
sigma = 2
#build dic
d_seq = dict()
d_seq = dict(Counter(sequence))
d_seq = clean_dic(d_seq,sigma)
d_seq = create_canidate(sequence,d_seq)
我已经知道创建所有组合的最好方法可能是使用 set(combinations(sequence,loop through all length)) 但我不知道如何在不遍历所有内容并且不保存任何内容的情况下获得计数.....
所以问题是:完成任务的最佳方式是什么?它会是什么样子?
非常感谢您的帮助:)
问候,
保罗
编辑: 我想做什么的例子。 对于示例序列 [1,2] 我想要结果: 1:2; 2:2; 3:1; 1,3:1; 1,1:1; 2,2:1; 2,3:1; 2,1:1; 3,1:1; 1,2:1; 1,1:1 ..... 等等。 请注意,必须保留顺序。
解决方法
我猜这是输出和代码。
如果输入序列没有排序,(1,1,2)
与 (1,2,1)
不同,使得组合为奇数。
输出:
1 2
2 2
3 1
1,1 1
1,2 4
1,3 2
2,2 1
2,3 2
1,2 2
1,3 1
1,3 4
2,2 1
1,3 2
from collections import Counter
from itertools import combinations
seq = [1,3,2]
seq.sort() # so that the combination tuples are non-decreasing
counter = Counter()
for r in range(1,len(seq)):
counter.update(combinations(seq,r)) # let counter count the occurrences
# sort the result by combination length,combination tuple,and the count
results = sorted(counter.items(),key=lambda s: (len(s[0]),s[0],s[1]))
for components,count in results:
print(','.join(str(s) for s in components),count)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。