【问题标题】:How can I get the concatenation of two lists in Python without modifying either one? [duplicate]如何在不修改任何一个的情况下在 Python 中连接两个列表? [复制]
【发布时间】:2011-05-19 15:28:15
【问题描述】:

在 Python 中,连接两个列表的唯一方法是 list.extend,它修改了第一个列表。有没有不修改参数就返回结果的连接函数?

【问题讨论】:

    标签: python concatenation sequence list-manipulation


    【解决方案1】:

    是的:list1 + list2。这给出了一个新列表,它是list1list2 的串联。

    【讨论】:

    • 嗯,这就解释了。我在找函数名,而不是运算符(是的,我知道运算符是由隐藏函数实现的。)
    • 其实你可以通过一个非隐藏函数来做到这一点:import operator, operator.add(list1, list2)
    • reduce(operator.add, [[1,2], [3,4], [5,6]]) == [1,2,3,4,5,6]。或者你可以使用 itertools.chain 代替 operator.add
    • 你也可以使用numpy.concatenate((a,b),axis=0)
    • 也可以使用list1.extend(list2)
    【解决方案2】:

    最简单的方法就是使用+ 运算符,它返回列表的连接:

    concat = first_list + second_list

    这种方法的一个缺点是现在使用了两倍的内存。对于非常大的列表,取决于您在创建后将如何使用它,itertools.chain 可能是您最好的选择:

    >>> import itertools
    >>> a = [1, 2, 3]
    >>> b = [4, 5, 6]
    >>> c = itertools.chain(a, b)
    

    这将为组合列表中的项目创建一个生成器,其优点是不需要创建新列表,但您仍然可以使用c,就好像它是两个列表的串联一样:

    >>> for i in c:
    ...     print i
    1
    2
    3
    4
    5
    6
    

    如果您的列表很大并且效率是一个问题,那么 itertools 模块中的这个方法和其他方法很容易知道。

    请注意,此示例用完 c 中的项目,因此您需要重新初始化它才能重用它。当然你可以直接使用list(c) 来创建完整列表,但这会在内存中创建一个新列表。

    【讨论】:

    • 只说itertools.chain返回一个生成器...
    【解决方案3】:

    concatenated_list = list_1 + list_2

    【讨论】:

    • @Johan,我对最短答案的投票。没有人注意到 > 由 Community♦ 标记为重复 2015 年 5 月 11 日 17:15
    • 回答问题不是很自信。另一个答案值得更多投票。
    【解决方案4】:

    你也可以使用sum,如果你给它一个start参数:

    >>> list1, list2, list3 = [1,2,3], ['a','b','c'], [7,8,9]
    >>> all_lists = sum([list1, list2, list3], [])
    >>> all_lists
    [1, 2, 3, 'a', 'b', 'c', 7, 8, 9]
    

    这通常适用于具有+ 运算符的任何东西:

    >>> sum([(1,2), (1,), ()], ())
    (1, 2, 1)
    
    >>> sum([Counter('123'), Counter('234'), Counter('345')], Counter())
    Counter({'1':1, '2':2, '3':3, '4':2, '5':1})
    
    >>> sum([True, True, False], False)
    2
    

    字符串除外:

    >>> sum(['123', '345', '567'], '')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: sum() can't sum strings [use ''.join(seq) instead]
    

    【讨论】:

    • 在 Python 3.5.2 上,sum 被记录为“此函数专门用于数值,并且可能拒绝非数值类型”。所以我不确定sum应该这样使用。
    • 很好地了解文档。有趣的是,他们不会仅仅拒绝非数字值,而是将意图隐藏在文档中。
    【解决方案5】:

    您总是可以创建一个新列表,这是添加两个列表的结果。

    >>> k = [1,2,3] + [4,7,9]
    >>> k
    [1, 2, 3, 4, 7, 9]
    

    列表是可变序列,所以我想通过扩展或追加来修改原始列表是有意义的。

    【讨论】:

    • 只有当你不再需要未修改的列表时,修改原始列表才有意义,所以在这种情况下它没有意义。
    【解决方案6】:

    如果你有两个以上的列表要连接:

    import operator
    from functools import reduce  # For Python 3
    list1, list2, list3 = [1,2,3], ['a','b','c'], [7,8,9]
    reduce(operator.add, [list1, list2, list3])
    
    # or with an existing list
    all_lists = [list1, list2, list3]
    reduce(operator.add, all_lists)
    

    它实际上不会为您节省任何时间(仍然会创建中间列表),但如果您有可变数量的列表要展平,例如*args,那就太好了。

    【讨论】:

      【解决方案7】:

      只是为了让您知道:

      当您编写list1 + list2 时,您正在调用list1__add__ 方法,该方法返回一个新列表。这样你也可以通过在你的个人类中添加__add__方法来处理myobject + list1

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-15
        • 2020-06-04
        • 2019-09-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多