2014-12-02 5 views
2

У меня есть список кортежей в Python, скажемКак найти индекс кортежа в списке кортежей в Python?

a = [('foo', 3), ('bar', 1)] 

, и я хочу, чтобы изменить второй элемент кортежа, содержащего 'foo'. В частности, я хотел бы увеличить это число. Другими словами, я хочу сделать

>>> increment(a, 'foo') 
>>> print a 
[('foo', 4), ('bar', 1)] 
+2

Рассматривали вы используете словарь, а? Тогда вы можете просто сделать 'a ['foo'] + = 1'. – senshin

+1

Содержимое кортежа не может быть изменено, хотя любой измененный объект внутри них может быть. К сожалению, вы хотите изменить целочисленное значение, которое является неизменным. Поэтому вам нужно будет заменить весь кортеж на нужный индекс в списке. – martineau

+0

@senshin Не могли бы вы расширить эту идею? – usernumber

ответ

1

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

def increment(a, name): 
    for i, x in enumerate(a): 
     if x[0] == name: 
      a[i] = (x[0], x[1] + 1) 
      break 
+0

с помощью 'break' вы предполагаете, что есть только один кортеж' foo', может быть больше 1 –

+1

@AlexanderStarostin: Это правда. Но ОП ссылался на * «кортеж» *, подразумевая, что есть только один. Очевидно, что если их может быть больше одного, удалите «break». –

+0

Конечно, спасибо. Я не был уверен, что все требования OP полностью, 'break' привносит некоторые ограничения, о которых OP должен знать :) –

0

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

a = [('foo', 3), ('bar', 1)] 

def find_index(name, seq): 
    for i, tpl in enumerate(seq): 
     if tpl[0] == name: 
      return i 
    return None 

i = find_index('foo', a) 
if i is not None: 
    a[i] = a[i][0], a[i][1]+1 

print(a) 

Выход:

[('foo', 4), ('bar', 1)] 
Смежные вопросы