python高效组

时间:2015-06-12 21:32:49

标签: python dictionary

我正在寻找从字典列表中提取项目的最有效方法。我有一个大约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的记录。

2 个答案:

答案 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)相关的问题