【问题标题】:How do I convert multiple lists inside a list using Python? [duplicate]如何使用 Python 转换列表中的多个列表? [复制]
【发布时间】:2016-01-18 07:54:47
【问题描述】:

我想在一个列表中转换多个列表?我正在使用循环执行此操作,但每个子列表项之间没有逗号。

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

【问题讨论】:

    标签: python join nested-lists


    【解决方案1】:

    这可以使用列表推导来完成,您可以将列表“扁平化”为单个列表,然后使用“join”方法将列表变为字符串。 ',' 部分表示用逗号分隔每个部分。

    ','.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

    但是,为了进一步分解它来解释它是如何工作的,我们可以看下面的例子:

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

    【讨论】:

    • 我会给那些不熟悉的人举一个不是列表理解的例子,这样他们就可以很容易地转化为理解。
    • 同意。我将扩展示例。
    • 并使用与 OP 相同的变量名,所以 my_list -> myList
    • @KronoS 让我知道你对“爆炸式”解释的看法。
    • 同意@Mathias711 我刚刚做了必要的更改。谢谢。
    【解决方案2】:
    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
    

    【讨论】:

      【解决方案3】:

      您也可以同时加入两个级别:

      >>> ','.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,结果总是一样。

      【讨论】:

      • 哦,我什至没有意识到您还添加了一个计时器。我只是做了同样的事情。 :) 非常有趣的结果。 +1
      • 呵呵,我想这很容易错过,这只是我帖子的 86% :-P 无论如何,很高兴看到你有类似的时间安排,很高兴在接受的答案中有时间安排。
      • 哈哈。嘿,这 14% 就让我开始玩时间安排了。
      • 做了更多测试。对于像[['a','b'],['a','b']] 这样非常小的情况,您的列表理解获胜。
      • 啊,是的,这里也一样。但似乎几乎可以忽略不计。在我们的解决方案之间使用您的输入,我的时间是:('comprehension', 1.1399926629965194), ('map', 1.3782716009882279)。你的类似吗?
      【解决方案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
      

      输出

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

      【讨论】:

        猜你喜欢
        • 2016-02-08
        • 2019-09-24
        • 2011-10-04
        • 2021-05-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-24
        • 1970-01-01
        相关资源
        最近更新 更多