将列表列表转换为字符串

时间:2013-10-31 22:36:39

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

我有一个列表,其中是另一个列表,我想要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循环并添加所有子列表?

真正的目标是让它在某种程度上对人类的可读性有所帮助,但我不希望你找到完整的解决方案。

7 个答案:

答案 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 - 虽然列表中strstr相同;他们都有效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问题,这些工具允许序列化对象并将序列化对象记录在文件中:

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

答案 6 :(得分:0)

您还可以像这样使用简单的列表理解:

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