如何比较同一元组列表中的出现次数

3
我有一个元组列表,像这样: L = [(23,56,48),(48,93,81),(48,56,23),(54,34,21),(48,98,71),(98,71,48),(56,23,48)] 其中一些元组具有完全相同的数字但顺序不同。我想计算元组的出现次数并覆盖具有相同值的元组。我在这里阅读了几个答案,并使用Counter方法做了一些尝试。但是我尝试的东西似乎对我没有用。我是Python的新手,所以也许我不理解Counter方法的确切用法。
L1 = Counter()
for item in L:
    for element in item:
        if element in item:
            L1[tuple(item)] = L1[tuple(item)] + 1
print(L1)

我得到的结果是:
Counter({(23, 56, 48): 3, (48, 93, 81): 3, (48, 56, 23): 3, (54, 34, 21): 3, 
(48, 98, 71): 3, (98, 71, 48): 3, (56, 23, 48): 3})

我想要得到的结果是:
Counter({(23, 56, 48): 3, (48, 98, 71): 3, (48, 93, 81): 1, (54, 34, 21): 1})

"覆盖那些内部具有相同值的内容" 是什么意思? - DeepSpace
也许我无法很好地解释它,可以查看实际和期望的结果以获取帮助。包含相同数字但顺序不同的元组必须被视为相同的元组。 - immalee
使用set()来比较元组。 - Denis Babochenko
我不知道set()函数是做什么的,也不知道如何使用它,我会尝试看看它是如何工作的。 - immalee
计数器本质上是一个字典,不能使用集合作为键 - 不过可以使用不可变集合:Counter(frozenset(t) for t in L)可以实现您想要的功能。 - Patrick Artner
@PatrickArtner 謝謝您的澄清。我還有很多不確定的事情,因為我是新手,雖然我覺得我知道Counter是做什麼的,但實際上我並不知道。我根本不知道frozenset,我顯然還有很長的路要走!很多工作,但我在努力!:) 再次感謝。 - immalee
1个回答

2

你需要将具有相同值的元组映射到相同的 ,一种方法是对元组进行排序(使用sorted函数):

from collections import Counter

L = [(23,56,48),(48,93,81),(48,56,23),(54,34,21),(48,98,71),(98,71,48),(56,23,48)]


result = Counter(tuple(e) for e in map(sorted, L))
print(result)

输出

Counter({(23, 48, 56): 3, (48, 71, 98): 2, (21, 34, 54): 1, (48, 81, 93): 1})

1
也许是Counter(frozenset(t) for t in L)?不确定哪个更高效。 - DeepSpace
是的,那也可能是另一个选项。 - Dani Mesejo
就像我之前说的,作为 Python 的新手,这是个问题,我根本没有考虑过使用类似 map 这样的东西。谢谢,我会看看它是如何工作的,并尝试理解它。 - immalee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接