我已经开始将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个要处理。
希望您能对此有所帮助。预先非常感谢。
答案 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}