【问题标题】:print two dimensional list打印二维列表
【发布时间】:2013-10-31 22:36:39
【问题描述】:

我有一个列表,其中是另一个列表,我想doc.write(a)

a = [[1, 2, "hello"],
     [3, 5, "hi There"],
     [5,7,"I don't know"]]
doc.write(''.join(a))



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

我该如何处理,我是否必须创建一个 for 循环来加入并添加所有子列表?

真正的目标是让它以某种方式被人类阅读,但我不希望你提供完整的解决方案。

【问题讨论】:

  • 你想对这些数字做什么?
  • 请显示您想要的实际输出。
  • 我想将列表写入文本文件。不知何故。
  • @inetphantom:你根本不在乎吗?它不需要被您的代码重新解析,不需要人类可读,或者可以导入到其他程序中,或者任何东西?在这种情况下,只需执行 write('stuff') 即可。
  • @abarnert 什么是“东西”??

标签: python python-3.x python-3.3


【解决方案1】:

你可以试试

>>> a = [[1, 2, "hello"],[3, 5, "hi There"],[5,7,"I don't know"]]
>>> 
>>> ''.join(str(r) for v in a for r in v)
"12hello35hi There57I don't know"

doc.write(''.join(str(r) for v in a for r in v))

【讨论】:

  • 自那个答案以来已经有很长时间了 - 使用'\t'.join() 这可以美化为一个标签分隔的列表,这可能更具可读性。
【解决方案2】:

你可以做不同的法律事情,任何人都无法在不知道你想要哪一个的情况下说哪一个是正确的。


首先,您可以只写astrrepr

>>> a=[[1, 2, "hello"],[3, 5, "hi There"],[5,7,"I don't know"]]
>>> repr(a)
'[[1, 2, \'hello\'], [3, 5, \'hi There\'], [5, 7, "I don\'t know"]]'

请注意,这就是 print 所做的(它会打印您提供的任何内容的 str - 尽管使用列表,strrepr 相同;它们实际上都是 '[' + ', '.join(map(repr, self)) + ']' )。


其次,您可以使用为数据持久性设计的格式,例如 JSON:

>>> json.dumps(a)
'[[1, 2, "hello"], [3, 5, "hi There"], [5, 7, "I don\'t know"]]'

第三,您可以选择某种方式将a 的每个元素的repr 连接在一起,这对于map 或理解来说是微不足道的。例如:

>>> '[' + ', '.join(map(repr, a)) + ']'
'[[1, 2, \'hello\'], [3, 5, \'hi There\'], [5, 7, "I don\'t know"]]'

……或……

>>> 'My stuff includes: ' + ','.join(map(repr, a)) + '\n'
'My stuff includes: [1, 2, \'hello\'],[3, 5, \'hi There\'],[5, 7, "I don\'t know"]\n'

或者你可以递归地做同样的事情。

或者您可以展平列表(例如,使用itertools.chain 将其展平一步,或使用itertools 文档或more-itertools 包中的配方递归),然后根据需要将这些片段串起来,然后加入他们。

或者你可以写LIST这个词。

所有这些都是传递给write的完全有效的东西。

【讨论】:

    【解决方案3】:

    列表理解是最好的选择:

    >>> ''.join([str(item) for sublist in a for item in sublist])
    "12hello35hi There57I don't know"
    

    考虑到性能和语法,这是similar SO question 中最推荐的方法。

    【讨论】:

      【解决方案4】:

      我也在寻找这个问题的答案。在阅读了这里的 cmets 之后,这就是我想出的:

      我也在寻找这个问题的答案。在阅读了这里的 cmets 之后,这就是我想出的:

      ','.join(str(' '.join(str(x) for x in v)) for v in a)
      

      这会产生类似的东西:

      1 2 hello,3 5 hi There,5 7 I don't know
      

      如果您希望所有空格作为分隔符,请在前面使用 ' ' 而不是 ','。

      【讨论】:

        【解决方案5】:

        使用 itertools 怎么样?

        from itertools import chain
        doc.write(''.join(map(str, chain(a))))
        

        或者:

        doc.write(''.join(str(i) for sub_list in a for i in sub_list))
        

        您建议使用for 循环。您确实可以这样做,尽管上面的选项可能更好。

        new_a = []
        for sub_list in a:
            for i in sublist:
                new_a.append(str(i))
        doc.write(''.join(new_a))
        

        这基本上是前一个选项,但已展开。

        除非你只想写第一个列表,在这种情况下你可以这样做:

        doc.write(''.join(map(str, a[0])))
        

        【讨论】:

          【解决方案6】:

          我很难确定,因为你的问题太短了,但在我看来你是一个 XY 问题,也就是说:
          你问了一个关于 Y 问题的问题,你认为这个问题需要解决才能摆脱上坡的 X 问题。但你真正的问题是你认为 Y 问题是解决真正问题 X 的方法,并且你在这里只提出 Y 问题。
          写到这里,我只是解释一下这里所说的:XY problem

          如果我是对的,我的观点是,您将有一个更好的方法来使用以下工具之一来解决您真正的 X 问题,这些工具允许序列化对象并将序列化的对象记录在文件中:

          pickle

          marshal

          shelve

          我不会解释和重复所有这些工具的文档,请阅读它们。

          .

          如果我错了,你真的只是想写一个字符串表示形式的对象,你也可以这样做:

          from pprint import pformat
          
          a = [[1, 2, "hello"],
               [3, 5, "hi There"],
               [5,7,"I don't know"]]
          
          with open('doc.txt','w') as f:
              f.write(pformat(a,width=12))
          

          【讨论】:

          • 这更像是一个评论而不是一个答案。
          • 我认为这没有帮助。 OP 并没有询问如何做错事(例如使用正则表达式解析 XML),而是一个合理的问题。您提供的模块在写入人类可读的“文本文件”(我的重点)方面不是很有帮助,我认为不鼓励仅提供链接的答案。
          • @abarnert 我习惯性地欣赏你的回答和 cmets,但目前我不明白你的这个评论。在我看来,关键点是:当我认为 OP 试图找到一种方法来对他的问题应用错误的解决方案而不是找到一个真正好的和适应的解决方案时,我是否正确。如果是的话,我的建议是,在我看来,回答他的 X 问题而不是回答 Y 伪解决方案,应该得到与其他答案一样多的答案格式。
          • @sweeneyrod 您在哪里看到问题和我的回答中提到的 XML 和正则表达式 ?????
          • 解释为什么这个问题不是一个好问题并不是一个答案。任何与标准关闭原因之一大致匹配的答案都不是答案。即使是这样,没有评论的链接列表也不是答案。所以,这不是一个答案。 (话虽这么说,对你的答案投反对票的人可能应该将其标记为“不是答案”,正如 here 所解释的那样。)
          【解决方案7】:

          您也可以像这样使用简单的列表推导:

          doc.write([x for x in i for i in a])
          

          【讨论】:

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