【发布时间】:2018-08-26 15:46:49
【问题描述】:
我已经开始将 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 个要处理。
我希望你能帮我解决这个问题。非常感谢您。
【问题讨论】:
-
所以真正的最终结果是计数?为什么不只计算这些计数,而不是生成所有这些组合?
-
counts = {},然后是key = tuple(sorted(inputlist))和count = math.factorial(len(inputlist))和counts[key] = counts.get(key, 0) + count,其中 `inputlist 是这三个输入之一。根本不需要生成任何排列。 -
旁注:不需要
map(tuple, ...)),因为所有排列都已经是元组。你真的应该使用itertools.chain()来组合排列迭代器。 -
对于完整的 50 个列表结果,您生成长度为 3 还是长度为 15 的排列?
标签: python python-3.x tuples permutation frequency