2015-10-19 76 views
4

我想在列表中转换多个列表?我正在做一个循环,但每个子列表项不会在它之间得到一个逗号。如何使用Python在列表内转换多个列表?

myList = [['a','b','c','d'],['a','b','c','d']] 
myString = '' 
for x in myList: 
    myString += ",".join(x) 
print myString 

输出继电器:

a,b,c,da,b,c,d 

所需的输出:

a,b,c,d,a,b,c,d 

回答

7

这可以用一个列表理解,你会“扁平化”的名单列表进行到一个列表,然后使用“连接”方法使您的列表成为一个字符串。 ','部分表示用逗号分隔每个部分。

','.join([item for sub_list in myList for item in sub_list]) 

注:请在下面我分析一下什么是测试是对他人的最快的解决方案在这里提出

演示:

myList = [['a','b','c','d'],['a','b','c','d']] 
result = ','.join([item for sub_list in myList for item in sub_list]) 

结果的输出 - >a,b,c,d,a,b,c,d

但是,为了进一步分解这部分内容来解释这是如何工作的,我们可以看到下面的例子E:

# create a new list called my_new_list 
my_new_list = [] 
# Next we want to iterate over the outer list 
for sub_list in myList: 
    # Now go over each item of the sublist 
    for item in sub_list: 
     # append it to our new list 
     my_new_list.append(item) 

所以在这一点上,输出my_new_list将产生:

['a', 'b', 'c', 'd', 'a', 'b', 'c', 'd'] 

所以,现在我们有这个做的是使一个字符串。这是','.join()进来玩的地方。我们只是做这样的判断:

myString = ','.join(my_new_list) 

对外输出,这将使我们:

a,b,c,d,a,b,c,d 

进一步分析

所以,在这个寻求进一步的,它确实引起了我的兴趣。我怀疑实际上其他解决方案可能更快。所以,为什么不测试它!

我采取了所提出的每种解决方案,并用更大的样本集运行计时器,以查看会发生什么。运行代码产生递增的顺序如下结果:

  1. 地图:3.8023074030061252
  2. 链:7.675725881999824
  3. 理解:8.73164687899407

所以,这里的赢家实际上是地图的实现。如果有人有兴趣,这里是用来时间码结果:

from timeit import Timer 


def comprehension(l): 
    return ','.join([i for sub_list in l for i in sub_list]) 


def chain(l): 
    from itertools import chain 
    return ','.join(chain.from_iterable(l)) 


def a_map(l): 
    return ','.join(map(','.join, l)) 

myList = [[str(i) for i in range(10)] for j in range(10)] 

print(Timer(lambda: comprehension(myList)).timeit()) 
print(Timer(lambda: chain(myList)).timeit()) 
print(Timer(lambda: a_map(myList)).timeit()) 
+1

我会举一个例子,它不是那些不熟悉它们的列表理解,因此它们可以很容易地转化为理解。 – KronoS

+0

同意。我将展开这个例子。 – idjaw

+1

并使用与OP相同的变量名,所以my_list - > myList – Mathias711

7
from itertools import chain 

myList = [['a','b','c','d'],['a','b','c','d']] 

print(','.join(chain.from_iterable(myList))) 

a,b,c,d,a,b,c,d 
0
myList = [['a','b','c','d'],[a','b','c','d']] 
smyList = myList[0] + myList[1] 
str1 = ','.join(str(x) for x in smyList) 
print str1 

输出

a,b,c,d,a,b,c,d 
1

你也可以只参加两个级别:

>>> ','.join(map(','.join, myList)) 
'a,b,c,d,a,b,c,d' 

它比其他解决方案更短,速度更快:

>>> myList = [['a'] * 1000] * 1000 
>>> from timeit import timeit 

>>> timeit(lambda: ','.join(map(','.join, myList)), number=10) 
0.18380278121490046 

>>> from itertools import chain 
>>> timeit(lambda: ','.join(chain.from_iterable(myList)), number=10) 
0.6535200733309843 

>>> timeit(lambda: ','.join([item for sub_list in myList for item in sub_list]), number=10) 
1.0301431917067738 

我也试过[['a'] * 10] * 10[['a'] * 10] * 100000[['a'] * 100000] * 10和它总是相同的画面。

+0

哦,我甚至没有意识到你还添加了一个计时器。我也是这样做的。 :)非常有趣的结果。 +1 – idjaw

+1

嘿嘿,我猜这很容易错过,只有86%的帖子:-P无论如何,很高兴看到你有相似的时机,并且在接受的答案中有很好的时机。 –

+0

哈哈。嘿,那14%是我想要开始玩的时间。 – idjaw