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 Zen 包含规则
面对歧义,拒绝猜测
不过以下作品:
a = [1, 2, 3]
a += (4, 5, 6)
这里没有歧义使用什么类型。
为什么 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]
如果有帮助,您可以使用
+=
运算符:
>>> 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]