як додати значення кортежу?


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

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-туманність

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

9

У Python ви не можете. Кортежі незмінні.

У списку, що містить, ви можете замінити кортеж ('1', '2', '3', '4')іншим ('1', '2', '3', '4', '1234')кортежем.


9

Як згадувалося в інших відповідях, кортежі після їх створення незмінні, і список може краще відповідати вашим цілям.

Тим не менш, ще одним варіантом створення нового кортежу з додатковими елементами є використання оператора splat:

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

Мені подобається цей синтаксис, оскільки він виглядає як новий кортеж, тому він чітко повідомляє, що ви намагаєтесь зробити.

Використання значка, потенційне рішення:

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.