заменить кортеж внутри списка его первой записью - PullRequest
1 голос
/ 28 февраля 2012

Я использую Python 3

У меня есть список разных кортежей. первое значение каждого кортежа всегда одинаково, но остальные меняются. Как я могу выполнить поиск в списке после кортежа, содержащего первое значение, а затем заменить весь кортеж на новый внутри списка? например: это мой кортеж: (122, 23, 24, 9)

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

(125, 34, 35, 21)

(122, 341, 5, 27)

(124, 31, 51, 7)

Ответы [ 4 ]

8 голосов
/ 28 февраля 2012
l = [(125, 34, 35, 21), (122, 341, 5, 27), (124, 31, 51, 7)]
t = (122, 23, 24, 9)

out = [t if e[0] == t[0] else e for e in l]
print(out)

Это распечатывает:

[(125, 34, 35, 21), (122, 23, 24, 9), (124, 31, 51, 7)]
0 голосов
/ 28 февраля 2012
a = [(125, 34, 35, 21), (122, 341, 5, 27), (124, 31, 51, 7)]
t = (122, 23, 24, 9)
for i, v in enumerate(a):
    if v[0] == t[0]:
        a[i] = t
        break

Тем не менее, существуют разные значения при изменении значения списка, который вы перебираете, но потому что вы ломаетесь сразу после того, как я думаю, что нет проблем! Обратите внимание, что разрыв означает, что вы ищете только один возможный кортеж в списке, а также, если ваш список содержит миллионы записей, вы не просматриваете все значения, если ваше значение находится в начале списка, для повышения производительности.

Edit:

Добавлен кортеж для замены t

0 голосов
/ 28 февраля 2012

Вы можете искать элементы в списке, используя метод index или циклически перебирая список.Например, для метода index:

mylist = [(125, 34, 35, 21),
          (122, 341, 5, 27),
          (124, 31, 51, 7)]

idx = mylist.index((122, 341, 5, 27))
# idx should be '1'

Проблема в том, что он находит записи только в том случае, если весь кортеж точно найден.Так что это может быть не лучшим решением для вас.

С циклом это может выглядеть так:

for idx, itm in enumerate(mylist):
    if itm[0] == 122:
        mylist[idx] = (1,2,3,4,5) # your new tuple

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

0 голосов
/ 28 февраля 2012

Если ваш список равен l, а ваш кортеж - t, и у вас всегда есть только один кортеж для замены:

l[l.index([_ for _ in l if _[0] == t[0]][0])] = t

Не очень, я признаю.

Если естьнесколько кортежей в вашем списке, которые соответствуют первому значению, будет заменено только первое.

...