通过重复字典键值拆分python词典列表

时间:2013-05-28 05:56:51

标签: python list python-2.7 dictionary split

说我有一个词典列表:

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'},
]

如何将此列表拆分为单独的列表(或列表列表),其中“host”“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'},
]

3 个答案:

答案 0 :(得分: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'}]]

答案 1 :(得分:4)

这是来自groupby的{​​{1}}函数的完美用例:

itertools

答案 2 :(得分: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'}