Как сгруппировать двумерный список в Python на основе атрибута? - PullRequest
0 голосов
/ 03 мая 2018

Пример: Вот мой 2D список:

a=[]
a.append(['abc.com','ars','league1','man'])
a.append(['abcxyz.com','hah','league2','bah'])
a.append(['abcd.com','gah','league3','fah'])
a.append(['abcm.com','ada','league1','ads'])
a.append(['abcxyzf.com','gha','league1','tra'])
a.append(['abcdg.com','jhi','league2','yui'])

Что я хочу, чтобы мой вывод был:

print(a)
Output:
['abc.com','ars','league1','man']
['abcm.com','ada','league1','ads']
['abcxyzf.com','gha','league1','tra']
['abcxyz.com','hah','league2','bah']
['abcdg.com','jhi','league2','yui']
['abcd.com','gah','league3','fah']

То есть я хочу сгруппировать свой список в зависимости от атрибута в индексе 2.

По крайней мере, я хочу отличные значения столбца 3.

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

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

a=[]
a.append(['abc.com','ars','league1','man'])
a.append(['abcxyz.com','hah','league2','bah'])
a.append(['abcd.com','gah','league3','fah'])
a.append(['abcm.com','ada','league1','ads'])
a.append(['abcxyzf.com','gha','league1','tra'])
a.append(['abcdg.com','jhi','league2','yui'])

a.sort(key=lambda k: k[2])
print(a)

Выход:

[['abc.com', 'ars', 'league1', 'man'],
 ['abcm.com', 'ada', 'league1', 'ads'],
 ['abcxyzf.com', 'gha', 'league1', 'tra'],
 ['abcxyz.com', 'hah', 'league2', 'bah'],
 ['abcdg.com', 'jhi', 'league2', 'yui'],
 ['abcd.com', 'gah', 'league3', 'fah']]
0 голосов
/ 03 мая 2018

Ваша терминология вводит в заблуждение: в 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 используется для эффективного выравнивания вложенных списков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...