5

说我有一个字典列表:

foo = [
      {'host': 'localhost', 'db_name': 'test', 'table': 'partners'},
      {'host': 'localhost', 'db_name': 'test', 'table': 'users'},
      {'host': 'localhost', 'db_name': 'test', 'table': 'sales'},
      {'host': 'localhost', 'db_name': 'new', 'table': 'partners'},
      {'host': 'localhost', 'db_name': 'new', 'table': 'users'},
      {'host': 'localhost', 'db_name': 'new', 'table': 'sales'},
]

如何将此列表拆分为“主机”“db_name”相同的单独列表(或列表列表)?例如:

list1 = [
        {'host': 'localhost', 'db_name': 'test', 'table': 'partners'},
        {'host': 'localhost', 'db_name': 'test', 'table': 'users'},
        {'host': 'localhost', 'db_name': 'test', 'table': 'sales'},
]

list2 = [
        {'host': 'localhost', 'db_name': 'new', 'table': 'partners'},
        {'host': 'localhost', 'db_name': 'new', 'table': 'users'},
        {'host': 'localhost', 'db_name': 'new', 'table': 'sales'},
]
4

3 回答 3

12
>>> from collections import defaultdict
>>> dd = defaultdict(list)
>>> foo = [
      {'host': 'localhost', 'db_name': 'test', 'table': 'partners'},
      {'host': 'localhost', 'db_name': 'test', 'table': 'users'},
      {'host': 'localhost', 'db_name': 'test', 'table': 'sales'},
      {'host': 'localhost', 'db_name': 'new', 'table': 'partners'},
      {'host': 'localhost', 'db_name': 'new', 'table': 'users'},
      {'host': 'localhost', 'db_name': 'new', 'table': 'sales'},
]
>>> for d in foo:
        dd[(d['host'], d['db_name'])].append(d)

列表列表是字典的值

>>> dd.values()
[[{'table': 'partners', 'host': 'localhost', 'db_name': 'new'}, {'table': 'users', 'host': 'localhost', 'db_name': 'new'}, {'table': 'sales', 'host': 'localhost', 'db_name': 'new'}], [{'table': 'partners', 'host': 'localhost', 'db_name': 'test'}, {'table': 'users', 'host': 'localhost', 'db_name': 'test'}, {'table': 'sales', 'host': 'localhost', 'db_name': 'test'}]]
于 2013-05-28T05:59:05.513 回答
4

这是groupbyfrom 函数的完美用例itertools

from itertools import groupby

foo.sort(key = lambda x: (x['db_name'], x['host']))
it = groupby(foo, key = lambda x: (x['db_name'], x['host']) )

groups = []
keys = []
for k, g in it:
    groups.append(list(g))
    keys.append(k)

print groups
## >>>
##[
##    [{'table': 'partners', 'host': 'localhost', 'db_name': 'test'},
##     {'table': 'users', 'host': 'localhost', 'db_name': 'test'},
##     {'table': 'sales', 'host': 'localhost', 'db_name': 'test'}],
##    [{'table': 'partners', 'host': 'localhost', 'db_name': 'new'},
##     {'table': 'users', 'host': 'localhost', 'db_name': 'new'},
##     {'table': 'sales', 'host': 'localhost', 'db_name': 'new'}]
##]

##or make a dict
d = dict(zip(keys, groups))
于 2013-05-28T06:17:11.547 回答
1

你可以这样做:

sp={}
for d in foo:
    sp.setdefault((d['host'],d['db_name']),[]).append(d)

然后打印它:

for l in sp.values():
    for d in l:
        print d
    print     


{'table': 'partners', 'host': 'localhost', 'db_name': 'new'}
{'table': 'users', 'host': 'localhost', 'db_name': 'new'}
{'table': 'sales', 'host': 'localhost', 'db_name': 'new'}

{'table': 'partners', 'host': 'localhost', 'db_name': 'test'}
{'table': 'users', 'host': 'localhost', 'db_name': 'test'}
{'table': 'sales', 'host': 'localhost', 'db_name': 'test'}
于 2013-05-28T06:08:48.423 回答