按小于某个值范围的键过滤字典

问题描述 投票:0回答:5

我有一本这样的字典,

d = {1:'a', 2:'b', 3:'c', 4:'d'}

现在我想过滤字典,其中键应该大于1且小于4,所以字典将是,

d = {2:'b', 3:'c'}

我可以使用 for 循环来迭代所有键来完成此操作。但执行时间会更多地寻找一些最快的方法来以 pythonic 方式更有效地执行此操作。

python python-3.x list dictionary
5个回答
2
投票

更Pythonic的方式是字典理解

d = {k: v for (k, v) in d.items() if k > 1 and k < 4}

如果效率是瓶颈,您可能需要尝试使用一些基于树的结构,而不是基于哈希的字典。


1
投票

您可以尝试以下代码:

d = {k:v for k,v in d.items() if 1<k<4}

1
投票

Pythonic 方式是使用 字典理解:

{key: value for key, value in d.items() if 1 < key < 4}

它具有足够的可读性:对于字典中

key
中的每个
value
items
,保留
key: value
key
对在 1 和 4 之间。


0
投票

Python 字典使用键的哈希值来有效地查找和存储数据。不幸的是,这意味着它们不允许您使用这些键的数字属性来选择数据(您可以使用切片来索引列表的方式)。

所以我认为做你想做的事情的最好方法可能只是字典理解,根据你的边界值测试每个键:

d = {key: value for key, value in d.items() if 1 < key < 4}

0
投票

正如其他答案中提到的,Python 字典实际上是哈希映射。这意味着键必须是可散列的,但不必与全排序进行比较。 (含义键不一定定义

<
<=
>
>=
运算符的行为。)

但是,如果您知道您的键类型确实具有用于全订单比较的运算符(例如,如您的示例中所示,类型

int
),您可以:

  1. 首先提取钥匙
  2. 通过过滤操作选择您想要的键
  3. 使用过滤后的键来获取您的值

你可能会做这样的事情:

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
© www.soinside.com 2019 - 2024. All rights reserved.