按列列出的列表列表的pythonic转换

时间:2012-02-09 17:38:07

标签: python

我有一个与数组对应的列表列表(列表中的每个列表都有相同的条目数):

a = [[1,2,3],[4,5,6],[7,8,9]]

我想将其转换为单个字符串:

"1,4,7\t2,4,8\t3,6,9"

即使每列成为逗号分隔的a字符串值列表。我的numpy数组解决方案非常糟糕:

b = array(b)
l = len(a)
result = "\t".join([",".join(map(str, b[:,r])) for r in range(l)])

有更优雅的方式吗?谢谢。

4 个答案:

答案 0 :(得分:8)

您可以使用zip()转换列表列表:

>>> zip(*a)
[(1, 4, 7), (2, 5, 8), (3, 6, 9)]

其他一切都很简单:

>>> "\t".join(",".join(map(str, r)) for r in zip(*a))
'1,4,7\t2,5,8\t3,6,9'

答案 1 :(得分:3)

使用zip()功能获取

>>> a = [[1,2,3],[4,5,6],[7,8,9]]
>>> zip(*a)
[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
>>>

而不是你的事。

>>> a = [[1,2,3],[4,5,6],[7,8,9]]
>>> b = zip(*a)
>>> result = "\t".join([",".join(map(str, r)) for r in b])
>>> result
'1,4,7\t2,5,8\t3,6,9'
>>>

答案 2 :(得分:2)

你可以用这样的numpy来更快地做到这一点:

>>> a = numpy.array([[1,2,3],[4,5,6],[7,8,9]])
>>> import StringIO
>>> s = StringIO.StringIO()
>>> numpy.savetxt(s, a.T, fmt="%d", delimiter=",", newline="\t")
>>> s.getvalue()
'1,4,7\t2,5,8\t3,6,9\t'

这不需要分配额外的内存来复制数组,因为.T返回数组的视图,而不是副本。 Numpy的savetext函数也应该比在python中执行此操作更快。

答案 3 :(得分:0)

zip()已经有更好的解决方案,但这也可以解决问题:

>>> '\t'.join(','.join(str(b[j]) for b in a) for j in range(len(a)))
'1,4,7\t2,5,8\t3,6,9'