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

10
我有一个如下所示的字典: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,使得d1包含以下键:0, 1, 2, 100, 101, 102。最终输出应为:d1={0:1, 1:2, 2:3, 100:7, 101:8, 102:9}。请问是否有一种高效的Pythonic方法可以实现此操作,考虑到我的真实字典包含超过2,000,000个项目?我认为这个问题适用于所有情况下,当键是整数时,切片需要遵循某些不等式规则,并且最终结果需要在同一个字典中放置一堆切片的情况。

这些规则是从哪里来的?如果这些键没有值,应该发生什么?您考虑过使用字典推导式 {k: d[k] for k in [0, 1, ...]} 吗? - jonrsharpe
在我的情况下,所有的键都有值。 - FaCoffee
1
你不能真正地“切分”一个字典,因为它是可变映射而不是序列。我认为字典推导式是你最好的选择。 - flybonzai
切片一个字典在本质上并不是不可能的;Python只是没有提供像Perl那样的语法来完成这个操作(虽然在Perl中,你只会得到相应的值,而不是哈希表的子集)。 - chepner
2个回答

14

你可以使用字典推导式:

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中,用filter(...)替换it.ifilter(...)):

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

嗯,我应该一开始就指出这个问题。虽然我知道需要的键,但它们太多了,不能直接放在一个元组中。有没有办法使用不等式规则来构建这个元组呢? - FaCoffee
@CF84:不等式规则的定义是什么?请分享完整信息,我们无法读取您的思想 :) - Moinuddin Quadri
一个定义可以是“草拟”所有键大于和小于某个值x的值。例如:06010001 < x <= 06012000 - FaCoffee
使用Python 3.x,您只需通过 filter(...) 将其替换为 it.filter(...)。 - Olivier Pellier-Cuit

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接