我正在寻找从字典列表中提取项目的最有效方法。我有一个大约5k字典的列表。我需要提取那些特定字段的分组给出超过阈值T个记录的记录/项目。例如,如果T = 2且字典键' id':
list = [{'name': 'abc', 'id' : 1}, {'name': 'bc', 'id' : 1}, {'name': 'c', 'id' : 1}, {'name': 'bbc', 'id' : 2}]
结果应为:
list = [{'name': 'abc', 'id' : 1}, {'name': 'bc', 'id' : 1}, {'name': 'c', 'id' : 1}]
即。具有一些id的所有记录,使得至少有3个相同id的记录。
答案 0 :(得分:1)
开始我会根据你的id制作一本字典
control = {}
for d in list:
control.setdefault(d['id'],[]).append(d)
从这里你要做的就是检查控制的长度,看它是否大于你指定的阈值
把它放在像这样的函数中
def find_by_id(obj, threshold):
control = {}
for d in obj:
control.setdefault(d['id'], []).append(d)
for val in control.values():
if len(val) > threshold:
print val
答案 1 :(得分:1)
l = [{'name': 'abc', 'id' : 1}, {'name': 'bc', 'id' : 1}, {'name': 'c', 'id' : 1}, {'name': 'bbc', 'id' : 2}]
from collections import defaultdict
from itertools import chain
d = defaultdict(list)
T = 2
for dct in l:
d[dct["id"]].append(dct)
print(list(chain.from_iterable(v for v in d.values() if len(v) > T)))
[{'name': 'abc', 'id': 1}, {'name': 'bc', 'id': 1}, {'name': 'c', 'id': 1}]
如果你想把它们分组,不要只使用每个值:
[v for v in d.values() if len(v) > T] # itervalues for python2
[[{'name': 'abc', 'id': 1}, {'name': 'bc', 'id': 1}, {'name': 'c', 'id': 1}]]
避免使用list作为变量,因为它会影响python列表类型,如果你有一个变量list
,那么上面的代码会引起一些与d = defaultdict(list)
相关的问题