как добавить значение кортежу?


79

Я работаю над сценарием, в котором есть список таких кортежей ('1','2','3','4'). например:

list = [('1','2','3','4'),
        ('2','3','4','5'),
        ('3','4','5','6'),
        ('4','5','6','7')]

Теперь мне нужно добавить '1234', '2345', '3456'и , '4567'соответственно , в конце каждого кортежа. например:

list = [('1','2','3','4','1234'),
        ('2','3','4','5','2345'),
        ('3','4','5','6','3456'),
        ('4','5','6','7','4567')]

Это вообще возможно?


8
кросс-языковое решение? ;)
Snowbear 06

2
Добро пожаловать в StackOverflow! Справа, когда вы задавали свой вопрос, было удобное поле « Как форматировать» . Стоит прочитать, так как ссылка на страницу находится в [?] Прямо над областью вопроса.
TJ Crowder

3
По крайней мере, в Python кортежи неизменяемы. Если вы хотите «добавить что-то в кортеж», почему бы не использовать изменяемую структуру данных с самого начала?
Феликс Клинг,

2
Я тоже так делаю - чаще всего с «файлом», потому что «для файла в файлах» это чертовски естественно! - но в целом вам, вероятно, следует избегать называть свои списки «списком», который заменяет встроенный «список».
DSM

Ответы:


137

Кортежи неизменяемы и не должны изменяться - для этого и предназначен тип списка. Вы можете заменить каждый кортеж на originalTuple + (newElement,), создав таким образом новый кортеж. Например:

t = (1,2,3)
t = t + (1,)
print t
(1,2,3,1)

Но я бы предпочел использовать списки с самого начала, потому что они быстрее вставляют элементы.

И еще один совет: не перезаписывайте встроенное имя listв вашей программе, лучше назовите переменную lили другое имя. Если вы замените встроенное имя, вы больше не сможете его использовать в текущей области.


23
Сокращениеt += 1,

1
Отличные моменты, однако, я нахожусь в неудачной ситуации, когда я хочу итеративно добавлять значения в sqlite3базу данных и мне нужно создать кортеж из добавляемых значений (поскольку требуется синтаксис VALUES (v1, v2, v3, ...). В этом случае зная, как добавлять значения в Кортеж очень полезен
HS-nebula

16

Судя по синтаксису, я предполагаю, что это Python. Суть кортежа в том, что он неизменяемый, поэтому вам нужно заменить каждый элемент новым кортежем:

list = [l + (''.join(l),) for l in list]
# output:
[('1', '2', '3', '4', '1234'), 
 ('2', '3', '4', '5', '2345'), 
 ('3', '4', '5', '6', '3456'), 
 ('4', '5', '6', '7', '4567')]

5
Конечно, это работает. Но действительно ли это нужно делать? Я думаю. Потому что это, в первую очередь, противоречит цели наличия кортежа. Или я не прав?
user225312 06

9

В Python вы не можете. Кортежи неизменяемы.

Однако в содержащем списке вы можете заменить кортеж ('1', '2', '3', '4')другим ('1', '2', '3', '4', '1234')кортежем.


9

Как упоминалось в других ответах, кортежи неизменяемы после создания, и список может лучше служить вашим целям.

Тем не менее, еще один вариант создания нового кортежа с дополнительными элементами - использовать оператор splat:

new_tuple = (*old_tuple, 'new', 'items')

Мне нравится этот синтаксис, потому что он выглядит как новый кортеж и ясно передает, что вы пытаетесь сделать.

Возможное решение с помощью splat:

list = [(*i, ''.join(i)) for i in list]


7

Как ответили другие, кортежи в python неизменяемы, и единственный способ «изменить» один - создать новый с добавленными элементами.

Но лучшее решение - это список. Когда необходимо вызвать любую функцию или метод, для которых требуется кортеж, создайте кортеж, используя кортеж (список).


4

Я просматривал некоторые детали, связанные с tupleи list, и понял следующее:

  • Кортежи являются Heterogeneousтипом данных коллекции
  • Кортеж имеет фиксированную длину (для каждого типа кортежа)
  • Кортежи всегда конечны

Таким образом, для добавления нового элемента в кортеж необходимо преобразовать его listи выполнить append()операцию с ним, а затем снова вернуть его в кортеж.

Но лично я чувствовал , о котором идет речь, если кортежи должны быть конечным , фиксированная длиной изделием , и если мы используем эти типы данных в нашей логике приложения , то должна не быть сценарием для добавления новых элементов или обновления значения элемента в Это. Итак, вместо списка кортежей это должен быть список самого списка , я прав в этом?


1
Существуют сценарии, в которых вам нужно передать кортеж функции, например, с помощью SQL (psycopg2) или взаимодействия с R (rpy2). Функции не всегда работают правильно, если вместо кортежа задан список. Иногда вы также получаете кортеж из функции, а не из списка. Кортежи могут защитить от ошибочного изменения исходного списка, когда вместо этого вам следует работать с копией списка. Так что да, списки прямо или косвенно являются посредниками в представленных ответах. Однако возврат к кортежу в конце по-прежнему логичен во многих сценариях.
Nate Wanner

2
    list_of_tuples = [('1', '2', '3', '4'),
                      ('2', '3', '4', '5'),
                      ('3', '4', '5', '6'),
                      ('4', '5', '6', '7')]


    def mod_tuples(list_of_tuples):
        for i in range(0, len(list_of_tuples)):
            addition = ''
            for x in list_of_tuples[i]:
                addition = addition + x
            list_of_tuples[i] = list_of_tuples[i] + (addition,)
        return list_of_tuples

    # check: 
    print mod_tuples(list_of_tuples)

0
OUTPUTS = []
for number in range(len(list_of_tuples))):
    tup_ = list_of_tuples[number]
    list_ = list(tup_)  
    item_ = list_[0] + list_[1] + list_[2] + list_[3]
    list_.append(item_)
    OUTPUTS.append(tuple(list_))

ВЫХОДЫ - это то, что вы желаете

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.