请原谅标题,如果不举例的话很难正确表达问题。
我有一个非常大的二维数组,其中的行大小不同,例如:
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/