Я хотел бы переформатировать следующий список, содержащие кортежи с целыми числами (разделяемых между некоторыми кортежами) и строки (своеобразные для каждого кортежа)Python 2.7: эффективно переформатировать список кортежей
mylist = [(8, 'dddd'), (8, '33333'), (8, 'fdsss'), (9, 'fsfjs'),(10, 'dddd'), (10, '33333'), (12, 'fdsss'), (12, 'fsfjs')]
так, что каждый кортеж содержит целое и каскадная строка всех строк, принадлежащих к нему, например, так:
mynewlist = [(8, 'dddd, 33333, fdsss'), (9, 'fsfjs'),(10, 'dddd, 333333'), (12, 'fdsss, fsfjs')
После некоторых раздумий, самые экономное решение, которое я придумал, это просто цикл по всем кортежам и конкатенация строк, пока число не Безразлично 't соответствует следующей:
mynewlist = []
label = ''
for i in range(len(mylist)-1):
if mylist[i][0] != mylist[i+1][0]:
mynewlist.append(tuple([mylist[i][0], label + mylist[i][1]]))
label = ''
else:
label = label + mylist[i][1] + ','
Это прекрасно работает. Тем не менее, я хотел бы знать, есть ли более эффективный/Pythonic способ создания списка. Я рассмотрел возможность использования списка, но это не позволило бы мне выбирать строки, не переходя через весь список много раз; то для каждого уникального целого числа должно быть задано понимание списка, что кажется расточительным. Я также рассмотрел предварительный выбор строк, связанных с уникальным целым числом, путем индексирования, но для меня это выглядит совершенно не-Pythonic.
Совет очень ценен. Благодаря!
новый подкласс ... Overkill. Вместо этого используйте подход 'defaultdict' или' dict.setdefault() '. Но если вы это сделаете, используйте '__missing__' вместо переопределения' __setitem__'. –
Кроме того, OP хотел, чтобы строки * конкатенировались *, а не как вложенный кортеж. –
@MartijnPieters '(key,) + tuple (d [ключ])' дает плоский кортеж. – BrianO