2016-10-14 3 views
6

У меня есть список кортежей, как это:Python: обновление списка кортежей

список = [(1, 'д'), (2, 'ш'), (3, 'е'), (4, 'r')]

и я пытаюсь создать обновление функции обновления (item, num), которые ищут элемент в списке, а затем изменяют число.

, например, если я использую обновление (ш, 6) результат будет

list = [(1, 'q'), (6, 'w'), (3, 'e'), (4, 'r')] 

я попробовал этот код, но я была ошибка

if item in heap: 
     heap.remove(item) 
     Pushheap(item,num) 
    else: 
     Pushheap(item,num) 

Pushheap является функцией, нажмите кортежи в куча любые идеи?

+3

вы не можете назначить значение в кортеже, поэтому вам придется полностью заменить кортеж – njzk2

+7

Не совсем понятно, что вы хотите, чтобы функция выполняла. Пример, а также то, что вы пробовали, было бы полезно –

+2

Вы не можете. Кортежи неизменяемы. Однако вы можете удалить кортежи из списка и заменить их, чтобы обойти это. Но могу ли я спросить, почему вы используете кортеж, если вам нужно будет изменить их значения? –

ответ

5

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

lst = [(1, 'q'), (2, 'w'), (3, 'e'), (4, 'r')] 

def update(item, num): 
    for i, t in enumerate(lst): 
     if t[1] == item: 
      lst[i] = num, item 
      break 

update('w', 6) 
print(lst) 

выход

[(1, 'q'), (6, 'w'), (3, 'e'), (4, 'r')] 

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

+0

@ PM_2Ring Захват индекса через 'enumerate' был просвещен. +1 – user2728397

+3

@Rakesh_K 'enumerate' - очень полезная функция. Это не только приводит к чистому компактному коду, но и быстрее, чем зацикливание индексов и индексирование в списке (или в другой упорядоченной коллекции). BTW, он может взять дополнительный 'start' arg, если вы хотите начать подсчет с некоторого числа, отличного от нуля. –

3

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

Используя эти предположения, я рекомендую преобразовать список кортежей в словарь и затем использовать обычное назначение словаря. Это также предполагает, что заказ не имеет значения (если есть, вы можете использовать OrderedDict) и что одна и та же буква не появляется дважды (если это так, то только последний номер будет в dict).

>>> lst = [(1, 'q'), (2, 'w'), (3, 'e'), (4, 'r')] 
>>> item_dict = dict(i[::-1] for i in lst) 
>>> item_dict 
{'q': 1, 'r': 4, 'e': 3, 'w': 2} 
>>> item_dict['w'] = 6 
>>> item_dict 
{'q': 1, 'r': 4, 'e': 3, 'w': 6} 
1

Кортежи - непреложный объект. Это означает, что после их создания вы не можете менять содержимое.

Вы можете, обойти это, однако, заменив кортеж, который вы хотите изменить. Возможно, что-то такое, как это:

def change_item_in_list(lst, item, num): 
    for pos, tup in enumerate(lst): 
     if tup[1] == item: 
      lst[pos] = (num, item) 
      return 

l = [(1, 'q'), (2, 'w'), (3, 'e'), (4, 'r')] 
print(l) 
change_item_in_list(l, 'w', 6) 
print(l) 

Но @brianpck уже сказал, вы, вероятно, хотите (заказать) -dictionary вместо списка кортежей.

Смежные вопросы