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 循环来加入并添加所有子列表?

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

4

7 回答 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"

IE

doc.write(''.join(str(r) for v in a for r in v))
于 2013-10-31T22:40:26.680 回答
4

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


首先,您可以只写stror reprof a

>>> 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你给它的任何东西 - 尽管使用列表, thestr与 相同repr;它们都是有效的'[' + ', '.join(map(repr, self)) + ']')。


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

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

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

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

……或者……</p>

>>> '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中的食谱递归地展平),然后根据需要将这些片段串起来,然后将它们连接起来。itertoolsmore-itertools

或者你可以只写单词LIST

所有这些都是传递给write.

于 2013-10-31T22:43:45.787 回答
3

列表理解将是最佳选择:

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

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

于 2013-10-31T22:44:15.417 回答
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

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

于 2019-04-26T17:01:02.427 回答
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])))
于 2013-10-31T22:38:38.763 回答
0

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

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

泡菜

元帅

搁置

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

.

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

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))
于 2013-10-31T22:57:11.917 回答
0

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

doc.write([x for x in i for i in a])
于 2018-10-05T16:39:21.487 回答