过滤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]