2012-06-29 38 views
4

我有以下元组。我想要创建一个字符串,其输出如输出中所述。我要计算所有对应于'a'的元素,即多少个k1发生wrt'a'等对何为做到这一点Python元组操作和计数

a=[('a','k1'),('b','k2'),('a','k2'),('a','k1'),('b','k2'),('a','k1'),('b','k2'),('c','k3'),('c','k4')] 

输出应该在一个字符串输出的最简单的方法=“”

a k1 3 
a k2 1 
b k1 1 
b k2 3 
c k3 1 
c k4 1 

回答

2

你可以用defaultdict容易做加法部分。默认字典的工作方式与普通字典相似,只是它具有空密钥存储区的默认值,因此您可以在迭代数据集时轻松增加计数器。

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) 
+0

一些解释为什么这个作品会很好。 – millimoose

+0

+1非常简单。我只是写了相同的代码:)))) –

+2

collections.Counter更适合这里 –

5

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 Counter类是新的在Python 2.7中。现在您可以按照需要的顺序重新排列项目,并根据需要将它们转换为字符串。