How do I convert multiple lists inside a list using Python?
本问题已经有最佳答案,请猛点这里访问。
我想在一个列表中转换多个列表?我用一个循环来做,但是每个子列表项之间没有逗号。
1 2 3 4 5 | myList = [['a','b','c','d'],['a','b','c','d']] myString = '' for x in myList: myString +=",".join(x) print myString |
输出:
1 | a,b,c,da,b,c,d |
期望输出:
1 | a,b,c,d,a,b,c,d |
1 2 3 4 5 6 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 |
这可以通过使用一个列表理解来完成,在这个理解中,您将把列表"展平"为一个列表,然后使用"join"方法将列表变为一个字符串。","部分表示用逗号分隔每个部分。
1 | ','.join([item for sub_list in myList for item in sub_list]) |
注意:请查看下面我的分析,了解在这里提出的其他解决方案中,测试哪些是最快的解决方案。
演示:
1 2 | myList = [['a','b','c','d'],['a','b','c','d']] result = ','.join([item for sub_list in myList for item in sub_list]) |
结果输出->
但是,为了进一步将其分解为多个部分来解释这是如何工作的,我们可以看到以下示例:
1 2 3 4 5 6 7 8 | # 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) |
因此,此时,输出我的"新"列表将产生:
1 | ['a', 'b', 'c', 'd', 'a', 'b', 'c', 'd'] |
所以,现在我们要做的就是把它变成一个字符串。这就是
1 | myString = ','.join(my_new_list) |
输出将给我们:
1 | a,b,c,d,a,b,c,d |
进一步分析
所以,再进一步看,这真的激起了我的兴趣。我怀疑事实上其他的解决方案可能更快。所以,为什么不测试一下呢!
我把每一个建议的解决方案都拿出来,用一个更大的样本集对它们进行计时,看看会发生什么。运行代码会导致以下结果的增加:
所以,这里明确的赢家实际上是地图的实现。如果有人感兴趣,下面是用于对结果计时的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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 2 | >>> ','.join(map(','.join, myList)) 'a,b,c,d,a,b,c,d' |
它比其他解决方案更短,速度也更快:
1 2 3 4 5 6 7 8 9 10 11 12 | >>> 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 |
我也试过
1 2 3 4 | myList = [['a','b','c','d'],[a','b','c','d']] smyList = myList[0] + myList[1] str1 = ','.join(str(x) for x in smyList) print str1 |
输出
1 | a,b,c,d,a,b,c,d |