9

假设我有一个这样构建的字典:

d={0:1, 1:2, 2:3, 10:4, 11:5, 12:6, 100:7, 101:8, 102:9, 200:10, 201:11, 202:12}

并且我想通过以包含以下键的方式d1进行切片来创建子字典: . 最终输出应该是:dd10, 1, 2, 100, 101, 102

d1={0:1, 1:2, 2:3, 100:7, 101:8, 102:9}

鉴于我的真实字典包含超过 2,000,000 个项目,是否有一种有效的 Pythonic 方式来执行此操作?

我认为这个问题适用于键是整数的所有情况,当切片需要遵循某些不等式规则时,以及当最终结果需要将一堆切片放在同一个字典中时。

4

2 回答 2

12

您可以使用字典理解:

d = {0:1, 1:2, 2:3, 10:4, 11:5, 12:6, 100:7, 101:8, 102:9, 200:10, 201:11, 202:12}
keys = (0, 1, 2, 100, 101, 102)
d1 = {k: d[k] for k in keys}

在 python 2.7 中,您还可以使用(在 python 3.x 中替换it.ifilter(...)filter(...))计算键:

import itertools as it

d = {0:1, 1:2, 2:3, 10:4, 11:5, 12:6, 100:7, 101:8, 102:9, 200:10, 201:11, 202:12}
d1 = {k: d[k] for k in it.ifilter(lambda x: 1 < x <= 11, d.keys())}
于 2016-11-05T16:16:38.123 回答
3

创建子词典的一种简洁方法是使用operator.itemgetter. 此函数接受多个参数并返回一个新函数以返回一个包含给定迭代的相应元素的元组。

from operator import itemgetter as ig

k = [0, 1, 2, 100, 101, 102]
# ig(0,1,2,100,101,102) == lambda d : (d[0], d[1], d[2], d[100], d[101], d[102])
d1 = dict(zip(k, ig(*k)(d)))
于 2016-11-05T16:54:14.553 回答