说我有一个词典列表:
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'},
]
答案 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'}