Python在字典中根据条件筛选数据

首先创建一个字典

1
2
3
4
5
import random
import time

d = {str(x): random.randint(60, 100) for x in range(1, 21)}
print(d)

执行结果为:

1
{'16': 61, '3': 66, '17': 70, '10': 82, '1': 71, '18': 89, '5': 83, '4': 97, '19': 77, '12': 92, '8': 73, '11': 74, '15': 60, '13': 68, '20': 80, '7': 62, '2': 99, '6': 85, '14': 83, '9': 87}

现有一个需求, 需要此列表中筛选出值大于90的 id(key) 都有哪些, 以下给出四种实现方式

第一种方法: 循环迭代

1
2
3
4
5
6
7
print(time.time())
d2 = {}
for k in d:
if d[k] > 90:
d2[k] = d[k]
print(time.time())
print(d2)

执行结果为:

1
2
3
1500951937.126503
1500951937.126532
{'12': 92, '2': 99, '4': 97}

得到结果需要的时间为: 0.000029

第二种方法: filter 函数

1
2
3
4
print(time.time())
d5 = list(filter(lambda x: d[x] > 90, d))
print(time.time())
print(d5)

执行结果为:

1
2
3
1500951937.126604
1500951937.126618
['4', '12', '2']

得到结果需要的时间为: 0.000014

第三种方法: 字典解析式

1
2
3
4
print(time.time())
d3 = {k:v for k,v in d.items() if v > 90}
print(time.time())
print(d3)

执行结果为:

1
2
3
1500951937.126555
1500951937.126564
{'12': 92, '2': 99, '4': 97}

得到结果需要的时间为: 0.000009

第四种方法: 生成器表达式

1
2
3
4
5
print(time.time())
d4 = ({k: v} for k, v in d.items() if v > 90)
print(time.time())
for i in d4:
print(i)

执行结果为:

1
2
3
4
5
1500951937.126576
1500951937.126581
{'4': 97}
{'12': 92}
{'2': 99}

得到结果需要的时间为: 0.000005

总结:

在字典数据量较小时, 依然推荐使用字典解析式去筛选数据, 在数据量较大且数据需要一条一条处理时, 生成器依然是最佳的选择