我需要将一系列列表转换为由空格分隔的单行文本
def Function(lists):
Numbers= str(len(lists))+ " "
for item in lists:
for items in item:
Numbers = Numbers + str(items) +' '
print Numbers
Data = [[1,2,3],[10,20,30]]
Function(Data)
这应该返回“2 1 2 3 10 20 30” 然而,这种方法非常缓慢。
有没有办法更快地完成这项工作?
答案 0 :(得分:3)
您正在每个+
运算符上创建一个新字符串,这非常慢(当应用很多时)。而是使用str.join
的生成器表达式:
In [11]: from itertools import chain
In [12]: data = [[1,2,3],[10,20,30]]
In [13]: " ".join(str(i) for i in chain(*data))
Out[13]: '1 2 3 10 20 30'
编辑:
您可以使用所需的方法和方法附加列表长度,因为它不会影响性能:
" ".join((str(len(data)), " ".join(str(i) for i in chain(*data)))
EDIT2:
hcwhsa pointed out that generator expression has no advantage with str.join
。因此,您可能希望使用列表推导而不是生成器表达式。
答案 1 :(得分:2)
对我来说这是最简单的:
>>> data = [[1,2,3],[10,20,30]]
>>> " ".join([str(item) for var in data for item in var])
'1 2 3 10 20 30'
所以你可以像这样编写你的函数:
def fun(data):
return " ".join([str(item) for var in data for item in var])
我不知道这是否是您的错误,但如果您想将列表的长度添加为第一个数字,那么您可以执行以下操作:
def fun(data):
return str(len(data)) + ' ' + " ".join([str(item) for var in data for item in var])
答案 2 :(得分:1)
请考虑使用字符串的join
方法
def Function(lists):
data = " ".join(j for i in lists for j in i))
return " ".join([len(lists), data])