gpt4 book ai didi

python - 如何在 python 的二维列表中找到特定行的子集数? collections的Counter功能可以用吗?

转载 作者:太空宇宙 更新时间:2023-11-04 02:32:56 25 4
gpt4 key购买 nike

请原谅标题,如果没有示例,很难正确表达问题。

我有一个非常大的二维数组,其中包含不同大小的行,例如:

big2DArray =
[["a","g","r"],
["a","r"],
["p","q"],
["a", "r"]]

我需要返回一个字典,它必须看起来像这样:

{('a','g','r'): 1, ('a', 'r'): 3, ('p', 'q'):1}

发现 ('a', 'r') 元组的值为 3,因为它作为自身出现两次,作为元组的子集(小于或等于)出现一次('a', 'g', 'r')

通常我会使用这样的东西:

dictCounts = Counter(map(tuple, big2DArray))

对于 big2Darray,它会给出:

{('a','g','r'): 1, ('a', 'r'): 2, ('p', 'q'):1}

我的问题是,是否可以使用 Collections 的 Counter 函数,以便它也像上面解释的那样提供子集的计数?如果没有,是否有任何相对有效的方法来返回我想要的子集字典输出?

非常感谢!

编辑 1:只是为了更清楚!我不想返回所有子集,例如 {('a','g'): 1, ('a','r'):3} 等等。我只想返回二维数组中唯一行的计数。所以在这种情况下,计数为:('a','g','r'), ('a','r'), ('p','q')。

编辑 2:行 ["a","r"] 应该被视为等同于 ["r", "a"],元组 ('a','r') 和 (' r','a')

最佳答案

您可以使用 set.issubset在此处使用 collections.Counter

演示:

from collections import Counter

big2DArray = [["a","g","r"],
["a","r"],
["p","q"],
["a", "r"],
["r", "a"]]

counts = Counter(map(lambda x: tuple(sorted(x)), big2DArray))

count_lst = list(counts)
for i, k1 in enumerate(count_lst):
rest = count_lst[:i] + count_lst[i+1:]
for k2 in rest:
if set(k1).issubset(k2):
counts[k1] += 1

print(counts)

输出:

Counter({('a', 'r'): 4, ('a', 'g', 'r'): 1, ('p', 'q'): 1})

在上面的代码中,为了确保["r", "a"]["a","r"]是等价的,你可以预先对它们进行排序,并将它们作为元组添加到 Counter()

另一个更有效的方法是使用 frozenset,如另一个答案所示。

关于python - 如何在 python 的二维列表中找到特定行的子集数? collections的Counter功能可以用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48721469/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com