【问题标题】:Find most frequent combinations of numbers in 2D list python在二维列表python中查找最常见的数字组合
【发布时间】:2021-03-27 11:56:24
【问题描述】:

我有一个二维列表。内部列表都填充了 6 个介于 1 和 45 之间的随机整数。我想找出在 2 到 4 个数字之间的每个组合长度中,哪三个连续数字组合出现次数最多,以及它们实际出现的频率。为了简短起见,我只给出了出现次数最多的数字组合的例子,但我认为你明白了。我想到的清单和代码:

intlst = [[29, 38, 17, 30, 33, 41], [12, 20, 30, 33, 29, 38], [12, 20, 30, 29, 38, 41], [17, 30, 33, 41, 33, 45], [27, 29, 17, 30, 33, 41]]

所以两个数字长度的连续数字出现次数最多的组合是:29、38,出现了 3 次。

三个数字出现次数最多的组合是:12、20、30 出现两次。

出现次数最多的四个数字组合是:17、30、33、41 出现 3 次。

我想打印带有附加文本的结果,所以功能会很棒。这应该看起来像这样:

def countcombinations(intlst, length):
    #do the math
    return result

    print("most occuring combinations with a length of two:",countcombinations(intlist, length),"\n most occuring combinations with a length of three:",countcombinations(intlist, length),"\n most occuring combinations with a length of four:",countcombinations(intlist, length))

所以输出看起来像这样:

most occuring combinations with a length of two: 29, 38 3x times
                                                 .., .. nx times
                                                 .., .. nx times


most occuring combinations with a length of three: 12, 20, 30 2x times
                                                   .., .., .. nx times
                                                   .., .., .. nx times


most occuring combinations with a length of four: 17, 30, 33, 41 3x times
                                                  .., .., .., .. nx times 
                                                  .., .., .., .. nx times

我成功地使用元组获得了长度为 2 的结果,但我不知道如何用三个和四个数字长组合来做同样的事情。

【问题讨论】:

  • 你的意思是同一子列表的元素组合?
  • 不,实际上来自所有子列表。
  • 包含预期结果的完整示例在哪里?你的代码呢?

标签: python python-3.x list numpy multidimensional-array


【解决方案1】:

itertools.combinations 是完成这项任务的最佳工具。见下文:

from itertools import combinations
from collections import Counter

def most_freq(l, n):
    temp=[]
    for i in l:
        temp.extend(tuple(k) for k in combinations(i, n))
    res = Counter(temp)
    return res

for i in range(2,5):
    print(most_freq(l, i))

n=2 的输出:

l=[[2, 13, 30, 33, 39, 41], [17, 20, 27, 33, 39, 38]]

>>>print(most_freq(l, i))

Counter({(33, 39): 2, (2, 13): 1, (2, 30): 1, (2, 33): 1, (2, 39): 1, (2, 41): 1, (13, 30): 1, (13, 33): 1, (13, 39): 1, (13, 41): 1, (30, 33): 1, (30, 39): 1, (30, 41): 1, (33, 41): 1, (39, 41): 1, (17, 20): 1, (17, 27): 1, (17, 33): 1, (17, 39): 1, (17, 38): 1, (20, 27): 1, (20, 33): 1, (20, 39): 1, (20, 38): 1, (27, 33): 1, (27, 39): 1, (27, 38): 1, (33, 38): 1, (39, 38): 1})
    

【讨论】:

  • 不完全是我要找的...我不想得到子列表中已有数字的所有组合。我的想法是计算已经存在的,但感谢您的帮助!
猜你喜欢
  • 2019-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
相关资源
最近更新 更多