打印二维列表

11

我有一个列表,其中包含另一个列表,我想要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循环将所有子列表连接并相加?

真正的目标是使其对人类易读,但我不希望从您那里得到一个完整的解决方案。


3
请展示您所需的实际输出结果。 - abarnert
我想以某种方式将列表写入文本文件。 - inetphantom
@inetphantom:你完全不关心它的格式吗?它不需要被您的代码重新解析,也不需要被人类阅读,也不需要被导入到其他程序中,或者其他任何事情吗?如果是这样,只需执行 write('stuff') 就可以了。 - abarnert
@eyquem:当您对对象的表示没有任何要求时,它是可用于表示任何对象的完全有效的字符串。 - abarnert
@inetphantom 当你将一个对象写成文本文件中的字符串时,你的目的是什么?仅仅是为了使其可读吗?还是你需要将其取回并用作Python代码?根据答案不同,你的问题的解决方案也会有所不同。 - eyquem
显示剩余2条评论
7个回答

13
你可以尝试类似这样的东西。
>>> 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()可以将其美化为一个以制表符分隔的列表,这可能更易读。 - inetphantom

4

有许多法律可供选择,没有人知道哪个是正确的,除非知道你想要什么。


首先,你可以只写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中每个元素的表示组合在一起,使用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"

考虑到性能和语法,这是在类似的SO问题中最受推荐的方法。


1

我也在寻找答案,在阅读了这里的评论后,我得出了以下结论:

我也在寻找答案,在阅读了这里的评论后,我得出了以下结论:

','.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

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

0

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

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

0

使用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])))

0

由于您的问题太过简短,我很难确定,但我认为您可能遇到了 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))

这更像是一条评论而不是一个答案。 - abarnert
我认为这并没有什么帮助。楼主不是在询问如何做错某事(例如使用正则表达式解析XML),而是一个合理的问题。您提供的模块在编写人类可读的“文本文件”方面并不是很有帮助,我认为仅提供链接作为答案是不鼓励的。 - rlms
@abarnert,我一直很欣赏您的答案和评论,但是目前我不理解您的这条评论。在我看来,关键点是:当我认为OP试图找到一种将错误解决方案应用于他的问题而不是寻找真正好的和适合的解决方案时,我是正确的吗?如果是的话,我的建议是回答他的X问题,而不是回答Y伪解决方案,这样的回答格式在我看来同样值得一份答案。 - eyquem
@sweeneyrod,您在问题和我的回答中看到了XML和正则表达式的暗示吗? - eyquem
1
解释为什么问题不是一个好问题并不是一个答案。任何大致匹配标准关闭原因之一的答案都不是一个答案。即使是这样,没有评论的链接列表也不是一个答案。所以,这不是一个答案。(话虽如此,谁给你的回答点了踩可能应该将其标记为“不是答案”,如这里所述。) - abarnert
显示剩余9条评论

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