过滤python字典中包含特定string的项目

我是一个用python开发东西的C编码器。 我知道如何在C中进行以下操作(因此,在Python中使用类似于C的逻辑),但是我想知道“Python”的做法是什么。

我有一个字典d,我想操作的项目的一个子集,只有谁的关键(string)包含一个特定的子string。

即C逻辑将是:

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

我想像的python版本会是这样的

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

我在这里发现了很多关于过滤词典的post,但是找不到一个涉及到这个的post。

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

如何理解词典的理解 :

 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} 

去任何最可读和易于维护。 只是因为你可以把它写在一行,并不意味着你应该。 你现有的解决scheme是接近我会使用除了我会用户iteritems跳过价值查询,我讨厌嵌套ifs,如果我可以避免它们:

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

但是,如果你真的想让你迭代一个过滤的字典,那么我不会做build立过滤字典,然后遍历它的两个步骤的过程,而是使用一个生成器,因为什么是更pythonic(和真棒)发电机?

首先我们创build我们的生成器,好的devise决定了我们使它足够抽象以便可重用:

 # 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 

简而言之:发电机真棒。

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

乔纳森给你的答案使用字典的理解。 这是一个处理你的事情的方法。

如果你想用字典的价值做一些事情,你根本不需要字典理解:

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

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

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

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