【问题标题】:How to print elements in a list in new lines?如何在新行中打印列表中的元素?
【发布时间】:2012-10-12 21:16:33
【问题描述】:

我有一个清单

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'] 

它比那长得多,但那是一个sn-p。

现在我接下来要做的是:

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

因为我希望它显示该列表中最常用的 10 个单词及其计数,但我希望它为列表中的每个项目打印到新行中,而不是我收到此错误:

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

如果使用 Python 3,我们将不胜感激。

【问题讨论】:

    标签: python list tuples dictionary


    【解决方案1】:
    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,这几乎肯定不是他真正想要的。
    • 其实我已经测试过了,效果还不错。你能解释一下 map 函数到底是做什么的吗?我对 Python 很陌生。
    • 比什么更一般? “我希望它显示该列表中最常用的 10 个单词。”为单词打印 (word, count) 对并不是一个更通用的答案,而是针对不同问题的答案。
    • 另外,你真的应该教新的 Python 用户理解,而不是 map。请参阅stackoverflow.com/questions/1247486/… 进行长时间的讨论,但简短的版本是:如何将map 调用更改为返回x[0] 而不是str(x)
    • @abarnert, map(itemgetter(0), c.most_common(10))
    【解决方案2】:

    最简单的是:

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

    【讨论】:

    • 这是正确的,但不是最简单的。最简单的方法是修复他几乎正确的现有生成器表达式。
    • +1:这是最简单的。仅仅因为有人几乎编写了难以辨认的代码行,并不意味着修复它是最简单的。相反,那行难以辨认的代码是不可维护的,因此应该被抛弃并以可维护的形式重写(IE,Jon 提供的那个)。
    【解决方案3】:

    如果你只想要字符串:

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

    【讨论】:

    • 感谢您全部解释清楚,我应该在最初的问题中更清楚,我也想要计数,而不仅仅是单词。如果您可以编辑您的答案,我会接受,谢谢。
    • 我已经编辑了我的答案。但在那种情况下,gnibbler 的答案的第二个版本(即,除了变量命名,与我的第三个版本相同)已经给了你想要的。
    【解决方案4】:

    我很惊讶没有人建议使用解包运算符*,既然你说python3那为什么不做以下,你可以test it here too

    print(*[x[0]for x in L.most_common(10)], sep="\n")
    

    相关问题

    【讨论】:

      猜你喜欢
      • 2012-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多