我有一个看起来像这样的元组列表:
my_list = [(1,12),(12,1),(12,1),(20,15),(7,8),(15,20)]
无论订单如何,我都希望得到数字组合的计数。例如,如果要简单地打印,我希望输出为:
1,12 = 3
20,15 = 2
7,8 = 1
基本上,我有一个连接列表,但方向无关紧要,因此1到12与12到1相同。
我一直在研究这个问题并且无法提出一个干净的解决方案。我提出的所有内容都必须检查两个方向,但元组列表是随机的,因此覆盖所有可能性将是荒谬的。我可以轻松地用一组或者其他东西来计算独特的元组,但同样,我所考虑的“双向”计数的每个解决方案都是草率的。
我觉得这应该不是很难,但是我很长时间都在努力工作。任何帮助将不胜感激!
答案 0 :(得分:4)
您可以使用collections.Counter
,首先使用sorted
对元素进行规范化。
from collections import Counter
lst = [(1,12),(12,1),(12,1),(20,15),(7,8),(15,20)]
count = Counter(tuple(sorted(t)) for t in lst)
# output: Counter({(1, 12): 3, (15, 20): 2, (7, 8): 1})
然后你可以这样打印。
for value, amount in count.items():
print(value, '=', amount)
# Prints:
# (1, 12) = 3
# (15, 20) = 2
# (7, 8) = 1
答案 1 :(得分:1)
首先,您可以对列表进行排序
lst2 = [tuple(sorted(i)) for i in lst]
然后,您可以使用set()
查找此列表中的唯一值并计算它们的出现次数。
count = {}
for i in set(lst2):
num = len([1 for j in lst2 if j == i])
count.update({i:num})
print(count)
{(1,12):3,(7,8):1,(15,20):2}
答案 2 :(得分:1)
您可以尝试简单的方法而不导入这样的内容:
my_list = [(1,12),(12,1),(12,1),(20,15),(7,8),(15,20)]
count={}
for i in my_list:
if tuple(sorted(i)) not in count:
count[tuple(sorted(i))]=1
else:
count[tuple(sorted(i))]+=1
print(count)
输出:
{(15, 20): 2, (7, 8): 1, (1, 12): 3}
答案 3 :(得分:0)
您可以按尺寸交换所有位置,然后使用collections.counter
:
from collections import Counter
l = [(1,12),(12,1),(12,1),(20,15),(7,8),(15,20)]
new_l = Counter([[(b, a), (a, b)][a < b] for a, b in l])
for a, b in new_l.items():
print('{},{}:{}'.format(*(list(a)+[b])))
输出:
15,20:2
7,8:1
1,12:3