Сортировка подсписков в новые подсписки? - PullRequest
2 голосов
/ 19 августа 2011

У меня есть большое количество двухчленных подсписков, которые являются членами списка с именем mylist:

mylist = [['AB001', 22100],
          ['AB001', 32935],
          ['XC013', 99834],
          ['VD126', 18884],
          ['AB001', 34439],
          ['XC013', 86701]]

Я хочу отсортировать mylist в новые подсписки в зависимости от того,подсписки содержат ту же строку, что и первый элемент.Например, вот что я ищу для вывода моего кода:

newlist = [['AB001', 22100], ['AB001', 32935], ['AB001', 34439]],
          [['XC013', 99834], ['XC013', 86701]],
          [['VD126', 18884]]

Вот как я пытался закодировать это:

mylist = sorted(mylist)
newlist = []
for sublist in mylist:
    id = sublist[0]
if id == next.id:
    newlist.append(id)
print newlist

Я также пытался понять, еслиitertools.groupby() был правильным инструментом для этой проблемы.Может кто-нибудь помочь мне с этой проблемой?Заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 19 августа 2011

Обратите внимание, что вы не можете иметь десятичные литералы, начинающиеся с нуля.Я предполагаю, что это на самом деле хранится в переменной, поэтому здесь нет начального нуля.

Вы были правы в том, что это работа для groupby:

from itertools import groupby
from operator import itemgetter

mylist = [['AB001', 22100],
          ['AB001', 32935],
          ['XC013', 99834],
          ['VD126', 18884],
          ['AB001', 4439],
          ['XC013', 86701]]

print [list(value) for key, value in groupby(sorted(mylist), key=itemgetter(0))]

список-список, сгруппированный по первому элементу в подсписке.

[[['AB001', 4439], ['AB001', 22100], ['AB001', 32935]], 
 [['VD126', 18884]], 
 [['XC013', 86701], ['XC013', 99834]]]
0 голосов
/ 24 января 2019

collections.defaultdict

Решение itertools.groupby будет стоить O ( n log n ), поскольку вход должен быть отсортирован first Вы можете использовать defaultdict списков для гарантированного решения O ( n ):

from collections import defaultdict

dd = defaultdict(list)
for item in mylist:
    dd[item[0]].append(item)

res = list(dd.values())

print(res)

[[['AB001', 22100], ['AB001', 32935], ['AB001', 34439]],
 [['XC013', 99834], ['XC013', 86701]],
 [['VD126', 18884]]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...