2013-10-20 41 views
0

我需要一系列的列表转换成文本的一个单行一个空格将列表转换为纯文本的最快方法?

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” 但是这种做法是很慢的。

有没有办法做到这一点更快?

回答

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

编辑2:

hcwhsa pointed out that generator expression has no advantage with str.join。所以你可能想使用列表理解而不是生成器表达式。

+2

[A发生器表达式没有性能/存储器优点与'str.join'使用时(http://stackoverflow.com/a/9061024/ 846892)。 –

+0

我认为这是微不足道的。添加。 – utdemir

+0

@hcwhsa,我不知道'str.join'需要两遍以上的参数,谢谢。 – utdemir

1

请考虑使用字符串

def Function(lists): 
    data = " ".join(j for i in lists for j in i)) 
    return " ".join([len(lists), data]) 
1

join方法这是最简单的对我说:

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

预期的输出是'“2 1 2 3 10 20 30”'。 –

+0

@hcwhsa我认为这是一个错误。 –

+0

我不这么认为,请看:'Numbers = str(len(lists))+“”' –