Python:如何根据键的值对字典进行切片?

时间:2016-11-05 16:09:19

标签: python dictionary key slice hashable

说我有一个这样的字典:

const keys = Object.keys(criteria); const results = $(selector).filter(() => { const $this = $(this); return keys.every(key => criteria[key].includes($this.attr("data-" + key))); });

我希望通过切片const keys = Object.keys(criteria); const results = $(selector).filter(() => keys.every(key => criteria[key].includes(this.getAttribute("data-" + key))) ); 来创建子词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包含以下键:d。最终输出应为:

d1

考虑到我的真实词典包含超过2,000,000个项目,是否有一种有效的Pythonic方法呢?

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

2 个答案:

答案 0 :(得分:8)

你可以使用字典理解:

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())}

答案 1 :(得分:3)

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

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)))