我有一个列表,其中是另一个列表,我想要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循环并添加所有子列表?
真正的目标是让它在某种程度上对人类的可读性有所帮助,但我不希望你找到完整的解决方案。
答案 0 :(得分: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))
答案 1 :(得分:3)
你可以做不同的法律事务,没有人知道哪一个是正确的,而不知道你想要哪一个。
首先,您只需撰写str
的{{1}}或repr
:
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
与str
相同;他们都有效repr
)。
其次,您可以使用专为持久数据设计的格式,例如JSON:
'[' + ', '.join(map(repr, self)) + ']'
第三,你可以用你选择的某种方式将>>> json.dumps(a)
'[[1, 2, "hello"], [3, 5, "hi There"], [5, 7, "I don\'t know"]]'
的每个元素的repr连接起来,这对于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
的完全有效的东西。
答案 2 :(得分:3)
列表理解将是最佳选择:
>>> ''.join([str(item) for sublist in a for item in sublist])
"12hello35hi There57I don't know"
考虑到性能和语法,这是similar SO question中最推荐的方法。
答案 3 :(得分: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
如果您希望所有空格都用作分隔符,请在前面使用''代替','。
答案 4 :(得分: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])))
答案 5 :(得分:0)
我很难确定,因为你的问题太短了,但在我看来你处于XY问题,也就是说:
你问一个关于Y问题的问题,你认为这是一个需要解决的问题,以解决一个艰难的X问题。但你真正的问题是,你认为Y问题是回答真正问题X的方法,而你在这里只提出Y问题。
写下来,我只想解释这里所说的内容:XY problem
如果我是对的,我的意见是,您将有更好的方法使用以下工具之一来解决您的真实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))
答案 6 :(得分:0)
您还可以像这样使用简单的列表理解:
doc.write([x for x in i for i in a])