Ваша терминология вводит в заблуждение: в a
имеется список списков, а не список кортежей . Однако это не относится к решению, представленному ниже.
Кроме того, обратите внимание, что атрибуты здесь не участвуют. Мы получаем доступ к элементам списка .
Классический способ Python, который решает оба ваших вопроса (группировка и уникальные ключи), заключается в использовании collections.defaultdict
:
Настройка
a = []
a.append(['data1','data2','data3','data4'])
a.append(['data21','data22','data3','data24'])
a.append(['data31','data32','data4','data34'])
Решение
from collections import defaultdict
d = defaultdict(list)
for item in a:
d[item[2]].append(item)
Результат
defaultdict(list,
{'data3': [['data1', 'data2', 'data3', 'data4'],
['data21', 'data22', 'data3', 'data24']],
'data4': [['data31', 'data32', 'data4', 'data34']]})
Объяснение
- Инициализировать словарь списков по умолчанию.
- Повторяйте свой список списков.
- Добавление элементов к ключам, определенным 3-м элементом.
Ваш отсортированный формат списка тогда возможен через sorted
:
from operator import itemgetter
from itertools import chain
sorter = map(itemgetter(1), sorted(d.items()))
res = list(chain.from_iterable(sorter)))
[['data1', 'data2', 'data3', 'data4'],
['data21', 'data22', 'data3', 'data24'],
['data31', 'data32', 'data4', 'data34']]
sorter
сортирует элементы словаря, как если бы они были кортежами со значением ключа (то есть, поскольку ключи уникальны, по ключу). itemgetter(1)
извлекает второй элемент результата, то есть значения.
chain.from_iterable
используется для эффективного выравнивания вложенных списков.