关于join:如何使用python转换列表中的多个列表?

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

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

但是,为了进一步将其分解为多个部分来解释这是如何工作的,我们可以看到以下示例:

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']

所以,现在我们要做的就是把它变成一个字符串。这就是','.join()的来龙去脉。我们只需打这个电话:

1
myString = ','.join(my_new_list)

输出将给我们:

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

进一步分析

所以,再进一步看,这真的激起了我的兴趣。我怀疑事实上其他的解决方案可能更快。所以,为什么不测试一下呢!

我把每一个建议的解决方案都拿出来,用一个更大的样本集对它们进行计时,看看会发生什么。运行代码会导致以下结果的增加:

  • 地图:3.8023074030061252
  • 链条:7.675725881999824
  • 理解:8.73164687899407
  • 所以,这里明确的赢家实际上是地图的实现。如果有人感兴趣,下面是用于对结果计时的代码:

    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

    我也试过[['a'] * 10] * 10[['a'] * 10] * 100000[['a'] * 100000] * 10,结果总是一样的。


    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