Python - Список словаря к списку списка словаря - PullRequest
0 голосов
/ 23 сентября 2011

У меня есть такой список словаря

[
  {'word': u'live', 'sequence': 1L, 'part': 1L},
  {'word': u'school', 'sequence': 2L, 'part': 1L},
  {'word': u'job', 'sequence': 1L, 'part': 2L},
  {'word': u'house', 'sequence': 2L, 'part': 2L},
]

, который я хотел бы преобразовать в этот список списка словаря

[
  [
    {'word': u'live', 'sequence': 1L, 'part': 1L}
    {'word': u'school', 'sequence': 2L, 'part': 1L},
  ],
  [
    {'word': u'job', 'sequence': 1L, 'part': 2L},
    {'word': u'house', 'sequence': 2L, 'part': 2L},
  ],
]

На основе ключа part и заказано на sequence

Как я могу это сделать?

Ответы [ 3 ]

3 голосов
/ 23 сентября 2011

Поскольку itertools может сбивать с толку, вот как вы можете это сделать:

>>> import pprint
>>> import itertools
>>> l = [
...   {'word': u'live', 'sequence': 1L, 'part': 1L},
...   {'word': u'school', 'sequence': 2L, 'part': 1L},
...   {'word': u'job', 'sequence': 1L, 'part': 2L},
...   {'word': u'house', 'sequence': 2L, 'part': 2L},
... ]

>>> l2 = [sorted(list(g), key=lambda x:x["sequence"])
...       for k, g in itertools.groupby(l, key=lambda x:x["part"])]

>>> pprint.pprint(l2)
[[{'part': 1L, 'sequence': 1L, 'word': u'live'},
  {'part': 1L, 'sequence': 2L, 'word': u'school'}],
 [{'part': 2L, 'sequence': 1L, 'word': u'job'},
  {'part': 2L, 'sequence': 2L, 'word': u'house'}]]

Предполагается, что l уже отсортировано по клавише part, если нет, используйте

>>> l2 = [sorted(list(g), key=lambda x:x["sequence"])
...       for k, g in itertools.groupby(sorted(l, key=lambda x:x["part"]), 
...                                     key=lambda x:x["part"])]
1 голос
/ 23 сентября 2011

Группировка деталей по словарю:

import collections

dictlist = [
  {'word': u'live', 'sequence': 1L, 'part': 1L},
  {'word': u'school', 'sequence': 2L, 'part': 1L},
  {'word': u'job', 'sequence': 1L, 'part': 2L},
  {'word': u'house', 'sequence': 2L, 'part': 2L},
]

dd = collections.defaultdict(list)
for d in dictlist:
    dd[d['part']].append(d)
dd.values()

Чтобы упорядочить по порядку, просто использовал сортировку с указанным ключом сортировки:

[sorted(dd[k], key=lambda x: x['sequence']) for k in dd]

В целом, это производит:

[[{'part': 1L, 'sequence': 1L, 'word': u'live'},
  {'part': 1L, 'sequence': 2L, 'word': u'school'}],
 [{'part': 2L, 'sequence': 1L, 'word': u'job'},
  {'part': 2L, 'sequence': 2L, 'word': u'house'}]]
1 голос
/ 23 сентября 2011

sorted() (или list.sort()) и itertools.groupby().

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