Существует несколько способов сделать это.
Я бы сделал это, используя zip
и groupby
.
Первое:
>>> list(zip(list_1, list_2))
[('A-1', 'iPad'),
('A-1', 'iPod'),
('A-1', 'iPhone'),
('A-2', 'Windows'),
('A-2', 'X-box'),
('A-3', 'Kindle')]
Сейчас:
>>> import itertools, operator
>>> [(key, list(group)) for key, group in
... itertools.groupby(zip(list_1, list_2), operator.itemgetter(0))]
[('A-1', [('A-1', 'iPad'), ('A-1', 'iPod'), ('A-1', 'iPhone')]),
('A-2', [('A-2', 'Windows'), ('A-2', 'X-box')]),
('A-3', [('A-3', 'Kindle')])]
Таким образом, вы просто хотите, чтобы каждый group
, игнорируя key
, и вы хотите только второй элемент каждого элемента в group
. Вы можете получить второй элемент каждой группы с другим пониманием, или просто разархивированием:
>>> [list(zip(*group))[1] for key, group in
... itertools.groupby(zip(list_1, list_2), operator.itemgetter(0))]
[('iPad', 'iPod', 'iPhone'), ('Windows', 'X-box'), ('Kindle',)]
Я лично нахожу это более читаемым как последовательность отдельных преобразований итераторов, чем как одно длинное выражение. Взято до крайности:
>>> ziplists = zip(list_1, list_2)
>>> pairs = itertools.groupby(ziplists, operator.itemgetter(0))
>>> groups = (group for key, group in pairs)
>>> values = (zip(*group)[1] for group in groups)
>>> [list(value) for value in values]
... но счастливая среда, возможно, 2 или 3 линии, как правило, лучше, чем любая крайность.
Обязательно ли сортировать 'list_1' (чтобы все вхождения каждого значения индекса отображались в строке)? –
Да ... list_1 значения упорядочены ... все сначала A-1, затем A-2 и т. Д. ... и значения в списке_2 следуют соответствующему порядку в списке_1 – visakh
Спасибо за ответы ... один из несколько моментов, когда я хочу выбрать оба ответа ... :-) – visakh