为什么我不能在 Python 中使用“+”运算符将元组添加到列表中?

问题描述 投票:0回答:3

Python 不支持向列表添加元组:

>>> [1,2,3] + (4,5,6)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only concatenate list (not "tuple") to list

提供这种语言支持的缺点是什么?请注意,我希望这是对称的:

[1, 2] + (3, 4)
(1, 2) + [3, 4]
都将评估为一个全新的列表
[1, 2, 3, 4]
。我的理由是,一旦有人将 operator + 应用于元组和列表的混合,他们很可能会再次这样做(很可能在同一个表达式中),所以我们不妨提供列表以避免额外的转换。

这是我提出这个问题的动机。

我经常会遇到一些小集合,我更喜欢将它们存储为元组以避免意外修改并提高性能。然后我需要将这些元组与列表结合起来,并且必须将它们中的每一个转换为列表使得代码非常丑陋。

请注意,

+=
extend
可能适用于简单的情况。但一般来说,当我有一个表情

columns = default_columns + columns_from_user + calculated_columns

我不知道其中哪些是元组,哪些是列表。所以我要么必须将所有内容转换为列表:

columns = list(default_columns) + list(columns_from_user) + list(calculated_columns)

或者使用 itertools:

columns = list(itertools.chain(default_columns, columns_from_user, calculated_columns))

这两种解决方案都比简单的求和更难看;并且

chain
也可能更慢(因为它必须一次遍历输入一个元素)。

python operator-overloading language-design internals
3个回答
11
投票

这不受支持,因为

+
运算符应该是对称的。您期望什么返回类型? Python Zen 包含规则

面对歧义,拒绝猜测

不过以下作品:

a = [1, 2, 3]
a += (4, 5, 6)

这里没有歧义使用什么类型。


2
投票

为什么 python 不支持添加不同的类型:简单的答案是它们属于不同的类型,如果您尝试添加一个可迭代对象并期望得到一个列表怎么办?我自己想返回另一个可迭代对象。还要考虑

['a','b']+'cd'
输出应该是什么?考虑到显式优于隐式所有此类隐式转换都是不允许的。

为了克服这个限制,使用

extend
列表的方法来添加任何可迭代的,例如

l = [1,2,3]
l.extend((4,5,6))

如果你必须添加很多列表/元组写一个函数

def adder(*iterables):
    l = []
    for i in iterables:
        l.extend(i)
    return l

print adder([1,2,3], (3,4,5), range(6,10))

输出:

[1, 2, 3, 3, 4, 5, 6, 7, 8, 9]

1
投票

如果有帮助,您可以使用

+=
运算符:

>>> x = [1,2,3]
>>> x += (1,2,3)
>>> x
[1, 2, 3, 1, 2, 3]

您也可以显式使用列表构造函数,但就像您提到的那样,可读性可能会受到影响:

>>> list((1,2,3)) + list((1,2,3))
[1, 2, 3, 1, 2, 3]
© www.soinside.com 2019 - 2024. All rights reserved.