如何在 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)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...