2013-10-31 201 views
6

我有一个清单,这是另一个列表,我想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

你怎么想的数字呢? –

+3

请显示你想要的实际输出。 – abarnert

+0

我想在文本文件中写入列表。不知何故。 – inetphantom

回答

10

你可以尝试像

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

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


首先,你可以只写的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文档或与more-itertools包配方压平一个步骤itertools.chain,或递归),然后,但是你想字符串化的碎片,然后加入他们的行列了。

或者你可以只写字LIST

所有这些都是完全有效的事情传递到write

3

列表理解将是最好的选择:

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

这是最值得推荐的做法在similar SO question,考虑到性能和语法。

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

这不仅仅是一个答案而是一个评论。 – abarnert

+0

我不认为这有帮助。 OP不会问如何做错误的事情(例如用正则表达式解析XML),而是一个合理的问题。您给出的模块在写入人类可读的“**文本**文件”(我的强调)方面并不是很有帮助,我相信只有链接的答案是不鼓励的。 – rlms

+0

@abarnert我习惯性地感谢你的回答和评论,但是现在我不明白你的评论。在我看来,关键的一点是:当我认为OP试图找到一种方法来解决他的问题而不是找到一个真正的好的和适应性的解决方案时,我是对的。如果是的话,我的建议,这个回答他的X问题,而不是回答Y伪解决方案,在我看来,值得与其他答案一样多的答案格式。 – eyquem