Создать список, добавить данные и преобразовать в кортеж: кратчайший код [дублировать]

1

У меня есть, может быть, глупая проблема, но я не могу понять, как ее решить. Поэтому в основном я пытаюсь сделать следующее:

  • Создать список
  • Добавить элементы в список (хранятся во втором списке)
  • Преобразовать список в кортеж

Поэтому я подумал, что сделаю что-то вроде этого:

anotherList = [2,5,8]
myTuple = tuple([1,2,3].extend(anotherList))

Это не работает, поскольку оно вызывает ошибку:

TypeError: 'NoneType' object is not iterable

Это имеет смысл, поскольку результат операции extend не является списком. Проблема в том, что я не смог сделать это в одном строковом коде, но только в 4-строчном коде, например:

anotherList = [2, 5, 8]
myList = [1, 2, 3]
myList.extend(anotherList)
myTuple = tuple(myList)

Есть ли способ упростить этот код? Он выглядит излишне длинным!

  • 0
    list.extend() возвращает None , всегда, потому что список обновляется на месте . Не используйте его в списке литералов, это никогда не приведет к тому, что вы хотите. Вы хотели объединить что-нибудь? Затем используйте [...] + anotherlist .
  • 0
    @MartijnPieters, да, именно так! Я полностью пропустил concatenate , вот и все!
Показать ещё 2 комментария
Теги:
list
python-2.7
tuples

3 ответа

3
Лучший ответ

Вы не хотите использовать list.extend(), period. Вместо этого вы объединяете отображение списка (буквенный синтаксис) с другим списком, используйте +:

myTuple = tuple([1, 2, 3] + anotherList)

или вы можете преобразовать просто anotherList и префикс кортежа:

myTuple = (1, 2, 3) + tuple(anotherList)

Здесь компилятор Python может оптимизировать и хранить (1, 2, 3) в качестве константы с вашим объектом кода. Этот исходный кортеж создается один раз и повторно используется во всех исполнениях.

list.extend() предназначен для обновления существующего объекта списка на месте с помощью ссылки на этот список, но использование его в литеральном списке означает, что полученный расширенный список не имеет оставшихся ссылок и снова отбрасывается.

В Python 3.5 и выше вы также можете использовать новый итеративный синтаксис распаковки:

myTuple = (1, 2, 3, *anotherlist)

Обратите внимание, что там не требуется вызов tuple(), и поддерживается любой итеративный тип (а не только список). Python 2.7 находится в нем в прошлые дни, вам нужно начать планировать переход от него.

3

Вы можете добавлять списки:

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

Так что это будет примерно так:

anotherList = [2, 5, 8]
myList = [1, 2, 3]

myTuple = tuple(myList + anotherList)
2

Ну, это неясно, но...

Попробуй это:

l=[2,5,8]
print(tuple([1,2,3]+l))

Вы можете объединить +

Альтернативно можно сделать * (распаковка) в python 3:

print((*l, 1,2,3))

Или можете сделать chain из itertools:

import itertools
print(tuple(itertools.chain(l, [1,2,3])))

Или merge с heapq:

from heapq import merge
print(tuple(merge(l,[1,2,3])))

Или add operator формы:

import operator
print(tuple(operator.add(l, [1,2,3])))

Ещё вопросы

Сообщество Overcoder
Наверх
Меню