Python元组操作和计数

4

我有以下元组。 我想构建一个字符串,以按照输出所述的方式输出。 我想计算所有与'a'对应的元素的数量,即有多少个k1与'a'相关,以此类推。 最简单的方法是什么?

我有以下元组。 我想构建一个字符串,以按照输出所述的方式输出。 我想计算所有与'a'对应的元素的数量,即有多少个k1与'a'相关,以此类推。 最简单的方法是什么?
a=[('a','k1'),('b','k2'),('a','k2'),('a','k1'),('b','k2'),('a','k1'),('b','k2'),('c','k3'),('c','k4')]

输出应该是一个字符串output=""。
 a k1  3
 a k2  1
 b k1  1
 b k2  3
 c k3  1
 c k4  1
2个回答

6
使用collections中的Counter类:
>>> a = [('a', 'k1'), ('b', 'k2'), ('a', 'k2'), ('a', 'k1'), ('b', 'k2'), ('a', 'k1'), ('b', 'k2'), ('c', 'k3'), ('c', 'k4')]
>>> from collections import Counter
>>> c = Counter(a)
Counter({('b', 'k2'): 3, ('a', 'k1'): 3, ('a', 'k2'): 1, ('c', 'k3'): 1, ('c', 'k4'): 1})

您可以使用c.items()来遍历计数:
>>> for item in c.items():
...     print(item)
... 
(('a', 'k2'), 1)
(('c', 'k3'), 1)
(('b', 'k2'), 3)
(('a', 'k1'), 3)
(('c', 'k4'), 1)

上面的代码是Python 3。在Python 2.7中,Counter类是新的。现在可以按照需要重新排列项目并将其转换为字符串(如果需要)。

2
你可以使用defaultdict轻松完成添加部分。默认字典与普通字典类似,但对于空键存储具有默认值,因此在迭代数据集时可以轻松地增加计数器。请注意保留HTML标签。
a=[('a','k1'),('b','k2'),('a','k2'),('a','k1'),('b','k2'),('a','k1'),('b','k2'),('c','k3'),('c','k4')]
from collections import defaultdict
b = defaultdict(int)
for item in a:
    b[item] += 1

print b
defaultdict(<type 'int'>, {('a', 'k2'): 1, ('c', 'k3'): 1, ('b', 'k2'): 3, ('a', 'k1'): 3, ('c', 'k4'): 1})

而且,如果需要美化输出结果,只需遍历生成的数据并按照您想要的方式进行打印。
for key, value in b.iteritems():
    print '%s %s %s' % (key[0], key[1], value)

2
collections.Counter 更适合这里。 - John La Rooy
@gnibbler:计数器更适合的原因是什么?这种方法也很有效,对吧。在两种情况下,我都会进行第二次循环以获取输出。使用计数器有哪些优势? - Rajeev
Counter 纯粹适用于计算唯一信息位的数量。因此,如果您只想计算出现次数,那么 Counter 更加适合。 - Christian Witts
@Rajeev,defaultdict中的这种常见模式已经被添加到collections模块中,并称为Counter。当然,它具有性能优势,但在代码中也更清晰地表明正在“计数”某些内容。 - John La Rooy

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