结合组合时的Python记录频率

时间:2018-08-26 15:46:49

标签: python python-3.x tuples permutation frequency

我已经开始将python用于宠物项目,因为在excel之类的程序中无法组织此数据。希望您能给我一些有关如何获得所需结果的指导。请原谅我缺乏python素养。

我有以下代码,通过减少列表的数量和这些列表中的元素的数量来简化说明,从而简化了代码。

import itertools
from collections import Counter

a = list(itertools.permutations([32,36,41],3))
b = list(itertools.permutations([36,32,41],3))
c = list(itertools.permutations([19,31,7],3))

fulllist = a+b+c

print(Counter(map(tuple, fulllist)))

给出以下结果:

Counter({(32, 36, 41): 2, (32, 41, 36): 2, (36, 32, 41): 2, (36, 41, 32): 2, (41, 32, 36): 2, (41, 36, 32): 2, (19, 31, 7): 1, (19, 7, 31): 1, (31, 19, 7): 1, (31, 7, 19): 1, (7, 19, 31): 1, (7, 31, 19): 1})

这已经很不错了,但并不是我所需要的。现在,我已经有了由intertools生成的每个列表组合的第一个计数,我不再关心该列表中每个元素的顺序。因此,我想获得的最终结果是:

(32, 36, 41): 12 
(19, 31, 7): 6 

和排序一样,就像我上面写的一样。 我觉得我可能会盘旋,也许有一种更简单的方法来获得想要的结果。实际上,我的列表中有15个元素,其中约有50个要处理。

希望您能对此有所帮助。预先非常感谢。

3 个答案:

答案 0 :(得分:3)

如果您不计算排列(在这种情况下,请使用@Martin的答案),而该排列只是用于创建示例列表,则排序以使其顺序清晰无关紧要:

>>>print(Counter(tuple(sorted(x)) for x in fulllist))
Counter({(32, 36, 41): 12, (7, 19, 31): 6})

答案 1 :(得分:1)

如果您需要的只是可能排列的计数,那么只需计算即可。该数字只是输入长度的阶乘:

import math

permutationcount = math.factorial(len(inputlist))

如果要创建比len(inputlist) 的排列(例如20个中的3个),则公式为n! / (n - k)!

n = len(inputlist)
k = 3
permutationcount = math.factorial(n) // math.factorial(n - k)

当然,当k等于n时,请除以0 !,即1。

您可以对输入列表进行排序,然后将其转换为元组,以将键创建为映射:

from collections import Counter

def count_permutations(lists, k=None):
    counts = Counter()
    if k is None:
        k = len(lists[0])
    for l in lists:
        key = tuple(sorted(l))
        permutationcount = math.factorial(len(l)) // math.factorial(len(l) - k)
        counts[key] += permutationcount
    return counts

演示:

>>> count_permutations(([32,36,41], [36,32,41], [19,31,7]), k=3)
Counter({(32, 36, 41): 12, (7, 19, 31): 6})

您当然不需要在这里实际使用Counter,但是如果您需要.most_common()方法并且不想查找如何使用它,则仍然可以方便地使用它。按值对字典排序。

答案 2 :(得分:-1)

c = Counter(map(tuple, fulllist))
l = [ {tuple(sorted(i[0])):i[1]} for i in c.items()]  

for e in l:
    print(e)  

{(32, 36, 41): 2}
{(32, 36, 41): 2}
{(32, 36, 41): 2}
{(32, 36, 41): 2}
{(32, 36, 41): 2}
{(32, 36, 41): 2}
{(7, 19, 31): 1}
{(7, 19, 31): 1}
{(7, 19, 31): 1}
{(7, 19, 31): 1}
{(7, 19, 31): 1}
{(7, 19, 31): 1}