python - 如何使用 python 在 2D 列表中找到特定行的子集数量?可以使用收藏品的计数器功能吗?

标签 python dictionary multidimensional-array tuples subset

请原谅标题,如果不举例的话很难正确表达问题。

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

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}

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

非常感谢!

编辑 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 在 2D 列表中找到特定行的子集数量?可以使用收藏品的计数器功能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48721469/

相关文章:

javascript - jQuery parseJSON 多维数组

matlab - y = A *x + B 的多维线性回归

python - 如何将巨大的 Pandas 数据框保存到 hdfs?

python - 训练/测试矩阵图书交叉推荐系统

Python 编码风格 - 类内的属性/ setter ?

python - 重新计算Python字典中的值

python - 按组 pandas 选择每 n 个观察值

java - 创建一个方法来检查 Java 中的通用 HashMap 中是否存在值?

java - map 中的 Ljava.lang.String

c - 用完 ram 声明全局二维数组问题