Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
筛选python字典中键包含特定字符串的项_Python_Python 2.7_Dictionary_Filtering - Fatal编程技术网

筛选python字典中键包含特定字符串的项

筛选python字典中键包含特定字符串的项,python,python-2.7,dictionary,filtering,Python,Python 2.7,Dictionary,Filtering,我是一个用python开发东西的C程序员。我知道如何在C中执行以下操作(因此也知道如何在应用于python的类似C的逻辑中执行),但我想知道“python”的执行方式是什么 我有一个字典d,我想对一个子集的项目进行操作,只有那个些谁的键(字符串)包含一个特定的子字符串 i、 e.C逻辑为: for key in d: if filter_string in key: # do something else # do nothing, continu

我是一个用python开发东西的C程序员。我知道如何在C中执行以下操作(因此也知道如何在应用于python的类似C的逻辑中执行),但我想知道“python”的执行方式是什么

我有一个字典d,我想对一个子集的项目进行操作,只有那个些谁的键(字符串)包含一个特定的子字符串

i、 e.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
我在这里找到了很多关于过滤字典的帖子,但找不到一篇与此相关的帖子

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

如果你看到它,它应该是不言自明的,因为它读起来很像英语

此语法需要Python2.7或更高版本

在Python 3中,只有而不是
iteritems()
,因此您可以使用:

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

Jonathon给了你一种在课堂上使用听写理解的方法。这里有一种方法可以处理您的“做某事”部分

如果您想对字典的值进行处理,则根本不需要字典理解:

我正在使用
iteritems(
),因为您将问题标记为

现在,结果将出现在一个列表中,其中
some_函数
应用于字典的每个键/值对,其键中有
foo

如果您只想处理值而忽略键,只需更改列表:

results = map(some_function, [v for k,v in a_dict.iteritems() if 'foo' in k])
某些函数可以是任意调用的,因此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]

选择可读性最好、易于维护的内容。仅仅因为你可以在一行中写出它并不意味着你应该这样做。您现有的解决方案接近于我将使用的解决方案,而不是使用iteritems跳过值查找,如果可以避免,我讨厌嵌套ifs:

for key, val in d.iteritems():
    if filter_string not in key:
        continue
    # do something
然而,如果你真的想让你迭代一个过滤后的dict,那么我不会做构建过滤后的dict然后迭代它的两步过程,而是使用一个生成器,因为有什么比生成器更具pythonic(和awesome)呢

首先,我们创建了生成器,好的设计要求我们将其抽象到可以重用的程度:

# 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()))

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

为什么不使用
过滤的[u dict={k:d[k]如果过滤的[u string in k}
,但是我们在这里丢了几个键。在Python3中有
iteritems
吗?我不这么认为。因此,我的版本是兼容的,不是吗?在Python 3中,您将用
替换
iteritems
,这与Python 2.7的
iteritems
相同。我使用
iteritems()
的方法将比
items()
@Jonathin Reinhart更有效,我不知道这一点。谢谢。仅适用于Python2.7。在Python3中只有
items()
,它的行为类似于Python2.7的
iteritems
。这个问题对于Python2.7来说非常有趣。如何定义some_函数?在第一种情况下(k,v),它只需要两个参数吗?第一个键然后是值?是的,只是一个可调用的。所以
map(lambda a:a[0]*a[1],((k,v)表示k,v在{2:2,3:2}.iteritems()中,如果k==2))
-这将给你
[4]
。这是正确的,但比使用
map更具python风格,这是一个列表理解<代码>[f(v)表示k,d中的v.iteritems()如果k中的子字符串为k]
我认为它更可读,也更有效。@请注意,它不需要两个参数,只需要一个参数和两个元素。还有一个函数将解压为两个参数,但是它是一个惰性迭代器(必须在执行之前进行迭代,即
results=list(starmap(…)
用于starmap(…):…
)。请注意,
项:
应该是lambda定义中的
项:
。感谢@bkribbs指出错误。我现在已经改正了。
# 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()))