簡體   English   中英

為什么我不能在Python中使用'+'運算符將列表添加到列表中?

[英]Why can't I add a tuple to a list with the '+' operator in Python?

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包含規則

In the face of ambiguity, refuse the temptation to guess.

但以下工作如下:

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

沒有歧義在這里使用什么類型。

為什么python不支持添加不同的類型:簡單的答案是它們是不同的類型,如果你試圖添加一個iterable並期望列表出來怎么辦? 我自己想要返回另一個可迭代的。 還要考慮['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]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM