2011-09-23 97 views
0

的名单列表我有这种字典的名单Python的 - 名单词典字典

[ 
    {'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

由于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键排序,如果没有,用

+0

确实itertools令我感到困惑,谢谢你的代码位 –

+0

我首先对'part'和'sequence'进行排序(用'operator.itemgetter() '),以防记录失灵。 –

1

sorted()(或list.sort())和itertools.groupby()

+0

谢谢你的快速反应,但我无法破译intertools是如何工作的(我刚开始代码在Phyton/Django) –

1

集团使用字典的部分:

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'}]] 
+0

itertools似乎很强大 –