我有一本这样的字典,
d = {1:'a', 2:'b', 3:'c', 4:'d'}
现在我想过滤字典,其中键应该大于1且小于4,所以字典将是,
d = {2:'b', 3:'c'}
我可以使用 for 循环来迭代所有键来完成此操作。但执行时间会更多地寻找一些最快的方法来以 pythonic 方式更有效地执行此操作。
更Pythonic的方式是字典理解
d = {k: v for (k, v) in d.items() if k > 1 and k < 4}
如果效率是瓶颈,您可能需要尝试使用一些基于树的结构,而不是基于哈希的字典。
您可以尝试以下代码:
d = {k:v for k,v in d.items() if 1<k<4}
Pythonic 方式是使用 字典理解:
{key: value for key, value in d.items() if 1 < key < 4}
它具有足够的可读性:对于字典中
key
中的每个 value
和 items
,保留 key: value
的 key
对在 1 和 4 之间。
Python 字典使用键的哈希值来有效地查找和存储数据。不幸的是,这意味着它们不允许您使用这些键的数字属性来选择数据(您可以使用切片来索引列表的方式)。
所以我认为做你想做的事情的最好方法可能只是字典理解,根据你的边界值测试每个键:
d = {key: value for key, value in d.items() if 1 < key < 4}
正如其他答案中提到的,Python 字典实际上是哈希映射。这意味着键必须是可散列的,但不必与全排序进行比较。 (含义键不一定定义
<
、<=
、>
和 >=
运算符的行为。)
但是,如果您知道您的键类型确实具有用于全订单比较的运算符(例如,如您的示例中所示,类型
int
),您可以:
你可能会做这样的事情:
d = {1:'a', 2:'b', 3:'c', 4:'d'}
d_keys_filtered = (
list(
filter(
lambda key: key >= 2 and key <= 3,
d.keys(),
)
)
)
# one possible example of how to use the keys once you have them
d_filtered = {
key, d[key] for key in d_keys_filtered
}
# or
d_filtered = {
k, v for k, v in d.items() if k in d_keys_filtered
}
我个人喜欢这种方法,因为我发现它更容易阅读。 (为什么?因为它将 lambda 函数执行的过滤分离到自己单独的行中。在这个示例中,您有两个条件作为
lambda
的一部分。它仍然 相当 可读,但是如果你要向 lambda
添加更多条件,这会变得更难以解释,并且你的行长度会变得相当长。)
您当然可以将上面的示例压缩为更少的代码行,但这又会降低其可读性。
或者,如果您确实更喜欢其他人展示的字典扩展语法,并且有一个笨拙的条件,您可以用函数替换 lambda。 (或其他可调用的。)
def f_select_by_key(key) -> bool:
if key ... and key ... and key ...: # long condition/mutiple lines of conditions
return True
return False