Замена значений списка списков на список

Рейтинг: 2Ответов: 2Опубликовано: 10.11.2014

Есть такой список:

[(1, 11, u'a', u'w'), 
(1, 24, u'пd', u'fпр'), 
(1, 44, u'dы', u'fав'), 
(2, 66, u'аd', u'f'), 
(2, 24, u'd', u'f' ), 
(4, 5, u'd', u'sd')]

Нужно заменить первые значения: 1,1,1,2,2,4. Есть соответственный список других значений:

l2 = [12, 48, 99]

Хотелось бы получить:

[(12, 11, u'a', u'w'), 
(12, 24, u'пd', u'fпр'), 
(12, 44, u'dы', u'fав'), 
(48, 66, u'аd', u'f'), 
(48, 24, u'd', u'f' ), 
(99, 5, u'd', u'sd')]

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

Ответы

▲ 2Принят

itertools.groupby() может быть использован, чтобы сгруппировать кортежи в списке с одинаковыми первыми элементами:

#!/usr/bin/env python3
from itertools import groupby
from operator import itemgetter

grouped = map(itemgetter(1), groupby(L, key=itemgetter(0)))
L = [(new_value,) + item[1:] 
     for group, new_value in zip(grouped, l2)
     for item in group]

Результат

[(12, 11, 'a', 'w'),
 (12, 24, 'пd', 'fпр'),
 (12, 44, 'dы', 'fав'),
 (48, 66, 'аd', 'f'),
 (48, 24, 'd', 'f'),
 (99, 5, 'd', 'sd')]
▲ 1

У Вас в списке l2 всего три значения, а в большом списке 6. Не понятно, по какому принципу Вы меняете. В случае когда, в обоих списках одинаковое кол-во элементов, то можно написать:
L = [tuple(l2[i] + list(l[i]) for i in range(len(L))]