如果你只是想要字符串:
print("\n".join(element for element, count in c.most_common(10)))
如果您想以('foo', 11)
的形式打印字符串和计数:
print ("\n".join(str(element_and_count)
for element_and_count in c.most_common(10)))
如果您想以其他格式获得字符串和计数:
print ("\n".join("{}: {}".format(element, count)
for element, count in c.most_common(10)))
为什么?
most_common
函数返回
(element, count)
对。这些东西是元组,不是字符串。你不能简单地将元组连接在一起。当然,你可以将其转换为字符串(上面的选项#2),但这仅适用于实际上想要每行格式
('foo', 11)
的情况。要获取另外两个选项,你需要忽略元组的一半并使用另一半,或编写自己的格式表达式。
无论如何,你都想对
most_common
返回的序列中的每个成员执行某些操作。Pythonic的方法是使用列表推导式或生成器表达式来完成。
同时,你应该学习如何调试这些类型的问题。当
join
给出
TypeError
时,将其分解成片段,直到找到有效的片段(并尝试使用2而不是10进行测试,以便减少阅读量)。
>>> print("\n".join(c.most_common(2)))
TypeError: sequence item 0: expected str instance, tuple found
>>> c.most_common(2)
[('I', 4), ('man', 1)]
啊哈!列表中的每个元素都是由两个元素组成的元组,而不仅仅是一个字符串。为什么呢?
>>> help(c.most_common)
most_common(self, n=None) method of collections.Counter instance
List the n most common elements and their counts from the most
common to the least. If n is None, then list all element counts.
>>> Counter('abcdeabcdabcaba').most_common(3)
[('a', 5), ('b', 4), ('c', 3)]
好的,它返回最常见的元素及其计数。我只想要元素。所以:
>>> [element for element, count in c.most_common(2)]
['I', 'man']
这是我可以加入的事情:
>>> '\n'.join([element for element, count in c.most_common(2)])
'I\nman'
而且我不需要使用括号和圆括号(我可以使用表达式代替列表推导):
>>> '\n'.join(element for element, count in c.most_common(2))
'I\nman'
现在,我可以打印它:
>>> print('\n'.join(element for element, count in c.most_common(2)))
I
man
现在它正在工作,请打印全部10个:
>>> print('\n'.join(element for element, count in c.most_common(10)))
('I', 4)\n('man', 1)\n
,几乎肯定不是他真正想要的。 - abarnertmap(itemgetter(0), c.most_common(10))
- John La Rooyx[0]
比itemgetter(0)(x)
更易读。我不想深入讨论这个问题;Guido已经比我更有口才地阐述了这个论点(尽管他无法说服python-dev放弃完全使用map
和filter
)。 - abarnert