如何将列表中的元素打印在新行上?

4

我有一个列表

L = Counter(mywords)

在哪里

mywords = ['Well', 'Jim', 'opportunity', 'I', 'Governor', 'University', 'Denver', 'hospitality', 'There', 'lot', 'points', 'I', 'make', 'tonight', 'important', '20', 'years', 'ago', 'I', 'luckiest', 'man', 'earth', 'Michelle', 'agreed', 'marry', '(Laughter)', 'And', 'I', 'Sweetie', 'happy'] 

这只是一小部分,实际内容更长。

接下来我要做的是:

print ("\n".join(c.most_common(10)))

我希望它显示列表中最常用的10个单词和它们的数量,但我希望每个列表项都打印到新行中,而不是得到以下错误:

TypeError: sequence item 0: expected str instance, tuple found

使用Python 3,任何帮助都会受到赞赏。

4个回答

5
print ("\n".join(map(str, c.most_common(10))))

如果您想更多地控制格式,可以使用像这样的格式字符串。
print ("\n".join("{}: {}".format(k,v) for k,v in c.most_common(10)))

不行。这会打印出 ('I', 4)\n('man', 1)\n,几乎肯定不是他真正想要的。 - abarnert
实际上,我已经测试过了,它运行得很好。你能解释一下 map 函数到底是做什么的吗?我对 Python 还非常新手。 - Goose
比什么更一般?“我想让它显示该列表中使用最频繁的10个单词。”打印出单词和计数对并不是更一般的答案,而是另一个问题的答案。 - abarnert
此外,你真的应该教新的Python用户使用列表推导式,而不是map函数。请参考https://dev59.com/mHM_5IYBdhLWcg3wvV5w进行详细讨论,简短版的问题是:如何将`map`调用更改为返回`x[0]`而不是`str(x)`? - abarnert
@abarnert,map(itemgetter(0), c.most_common(10)) - John La Rooy
重点是你不能只写出你想要的表达式,你必须找到(或编写)一个等效的函数。x[0]itemgetter(0)(x)更易读。我不想深入讨论这个问题;Guido已经比我更有口才地阐述了这个论点(尽管他无法说服python-dev放弃完全使用mapfilter)。 - abarnert

1

最简单的是:

for item, freq in L.most_common(10):
    print(item, 'has a count of', freq) # or
    print('there are {} occurrences of "{}"'.format(freq, item))

这是正确的,但不是最简单的方法。最简单的方法是修复他几乎正确的现有生成器表达式。 - abarnert
这是最简单的。仅仅因为有人几乎写出了一行可读性极差的代码并且其还能运行,并不意味着修复它就是最简单的。相反,那种可读性极差的代码是无法维护的,因此应当舍弃并以一种可维护的形式重写(例如,Jon提供的那种形式)。 - ArtOfWarfare

1

如果你只是想要字符串:

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

谢谢你把所有的东西都解释清楚了,我在最初的问题中应该更清楚一些,我确实想要计数,而不仅仅是单词。如果你能编辑你的答案,我会接受它,谢谢。 - Goose
我已经编辑了我的回答。但是在那种情况下,gnibbler的第二个答案版本(除了变量命名之外与我的第三个版本相同)已经给出了您想要的内容。 - abarnert

1

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