过滤 Python 字典中的项,其中键包含特定的字符串

我是个 C 程序员,正在用 Python 开发一些东西。我知道如何在 C 中执行以下操作(因此在应用于 Python 的类似 C 的逻辑中) ,但是我想知道‘ Python’的方法是什么。

我有一个字典 d,我想操作这些条目的一个子集,只有那些键(string)包含特定子字符串的条目。

也就是说,C 逻辑应该是:

for key in d:
if filter_string in key:
# do something
else
# do nothing, continue

我在想蟒蛇的版本应该是

filtered_dict = crazy_python_syntax(d, substring)
for key,value in filtered_dict.iteritems():
# do something

我在这里找到了很多关于过滤字典的帖子,但是找不到一个与此相关的帖子。

我的字典不是嵌套的,我使用的是 python 2.7

180781 次浏览

词汇理解怎么样:

filtered_dict = {k:v for k,v in d.iteritems() if filter_string in k}

一旦你看到它,它应该是不言自明的,因为它读起来像英语非常好。

这种语法需要 Python 2.7或更高版本。

在 Python 3中,只有 dict.items(),而没有 iteritems(),因此您可以使用:

filtered_dict = {k:v for (k,v) in d.items() if filter_string in k}
input = {"A":"a", "B":"b", "C":"c"}
output = {k:v for (k,v) in input.items() if key_satifies_condition(k)}

Jonathon 给了你一个在 他的回答中使用字典理解的方法。这里是一个处理你的 做点什么部分的方法。

如果你想对字典的值做些什么,你根本不需要字典理解:

我使用的是 iteritems() ,因为你用 标记了你的问题

results = map(some_function, [(k,v) for k,v in a_dict.iteritems() if 'foo' in k])

现在,结果将在一个列表中,some_function应用于字典的每个键/值对,其键中包含 foo

如果你只想处理值而忽略键,只需改变列表内涵:

results = map(some_function, [v for k,v in a_dict.iteritems() if 'foo' in k])

some_function可以是任何可调用的,所以一个 lambda 也可以:

results = map(lambda x: x*2, [v for k,v in a_dict.iteritems() if 'foo' in k])

实际上不需要内部列表,因为您也可以传递一个 生成器表达式生成器表达式来映射:

>>> map(lambda a: a[0]*a[1], ((k,v) for k,v in {2:2, 3:2}.iteritems() if k == 2))
[4]

选择那些最易读、最容易维护的。仅仅因为你可以用一行写出来,并不意味着你应该这样做。您现有的解决方案接近于我会使用的方法,而不是使用迭代项来跳过值查找,如果我可以避免它们,我讨厌嵌套的 if:

for key, val in d.iteritems():
if filter_string not in key:
continue
# do something

然而,如果你真的想让你迭代过滤的结果,那么我不会做两个步骤的过程,建立过滤的结果,然后迭代通过它,而是使用一个生成器,因为什么是更 Python (和可怕)比生成器?

首先,我们创建我们的生成器,好的设计要求我们使它足够抽象以便可重用:

# The implementation of my generator may look vaguely familiar, no?
def filter_dict(d, filter_string):
for key, val in d.iteritems():
if filter_string not in key:
continue
yield key, val

然后我们可以使用这个生成器,通过简单易懂的代码,很好地、干净利落地解决问题:

for key, val in filter_dict(d, some_string):
# do something

简而言之: 发电机是令人敬畏的。

您可以使用内置的 过滤器函数根据特定条件筛选字典、列表等。

filtered_dict = dict(filter(lambda item: filter_str in item[0], d.items()))

优点是可以将其用于不同的数据结构。

您可以使用内置函数‘ filter ()’:

data = {'aaa':12, 'bbb':23, 'ccc':8, 'ddd':34}


# filter by key
print(dict(filter(lambda e:e[0]=='bbb', data.items() ) ) )


# filter by value
print(dict(filter(lambda e:e[1]>18, data.items() ) ) )

产出:

{'bbb':23}


{'bbb':23, 'ddd':34}