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]
. Мое соображение состоит в том, что, как только кто-то применяет оператор + к набору кортежей и списков, они, вероятно, снова сделают это (возможно, в том же выражении), поэтому мы могли бы также предоставить список, чтобы избежать дополнительных преобразований.
Вот моя мотивация для этого вопроса.
Часто случается, что у меня есть небольшие коллекции, которые я предпочитаю хранить как кортежи, чтобы избежать случайной модификации и помочь производительности. Затем мне нужно комбинировать такие кортежи со списками, а конвертировать каждый из них в список делает очень уродливый код.
Обратите внимание, что +=
или 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
также может быть медленнее (так как он должен перебирать входы по одному элементу за раз).
Как насчет того, чтобы быть последовательным? Используйте кортежи или используйте списки, но не оба из них. –
Если бы это было поддержано _at all_, я согласен с тем, что это было бы лучшим поведением, но я думаю, что если кто-то делает '2 + 'abc'', они явно хотят« 2abc'', так почему бы не разрешить его и т. Д. - Это слишком много толкований. Явный лучше, чем неявный. – agf
Вы можете просто использовать 'itertools.chain', чтобы связать свои вещи и никогда не использовать' + '. – hochl