Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.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 如何使用此iterable函数取消对列表的搜索?_Python_Iterator - Fatal编程技术网

Python 如何使用此iterable函数取消对列表的搜索?

Python 如何使用此iterable函数取消对列表的搜索?,python,iterator,Python,Iterator,我编写了一个python函数来搜索iterable: def iter_search(iterable, **search): for item in iterable: # Assume we will find something to yield yield_me=True # Cycle through keys that exist in the search and item for key in item.v

我编写了一个python函数来搜索iterable:

def iter_search(iterable, **search):
    for item in iterable:
        # Assume we will find something to yield
        yield_me=True

        # Cycle through keys that exist in the search and item
        for key in item.viewkeys() & search:
            if item[key] is not None:
                if item[key] != search[key]:
                    # Key didn't match, don't yield this item
                    yield_me = False
        if yield_me:
            yield item
非常有用,因为我的搜索“键”可以是任意数量的字典键值对:

new_iterable = iter_search(iter, ** { 'C' : 'US', 'Sex' : 'm' })
现在,我试图否定搜索,所以我尝试:

def iter_search(iterable, **search):
    for item in iterable:
        yield_me=True
        for key in item.viewkeys() & search:
            if item[key] is not None:
                if search[key][0] == '!':
                    if item[key] == search[key][1:]:
                        yield_me = False
                else:
                    if item[key] != search[key]:
                        yield_me = False
        if yield_me:
            yield item
但是现在,当我包含我的否定字符(“!”)时,它不会产生任何结果:

我错过了一些简单的事情。什么


编辑我测试的代码版本错误!以上操作很好。

我不确定我是否正确理解了您的意思,但据我所知,这可能会回答您的问题-

def iter_search(iterable, **search):
    for item in iterable:
        yield_me=False
        for key in item.viewkeys() & search:
            if item[key] is not None:
                if search[key][0] == '!':
                    if item[key] == search[key][1:]:
                        yield_me = True
        if yield_me:
            yield item

首先,您的第一个搜索功能可以简化为:

def iter_search(iterable, **search):
    for item in iterable:
        # Cycle through keys that exist in the search and item
        if len(search.viewitems() & item.viewitems()) == len(search):
            yield item
e、 g.如果
搜索
中的所有项目(键、值对)与项目项目匹配,则存在匹配项,您可以
生成

此功能的快速演示:

>>> demo = [
...     {'C': 'US', 'Sex': 'f', 'Age': 31},
...     {'C': 'US', 'Sex': 'm', 'Age': 42},
...     {'C': 'UK', 'Sex': 'm', 'Age': 24},
...     {'C': 'UK', 'Sex': 'f', 'Age': 50},
... ]
>>> list(iter_search(demo, C='US', Sex='m'))
[{'C': 'US', 'Age': 42, 'Sex': 'm'}]
使用否定搜索可以:

def iter_search(iterable, **search):
    positive = {k: v for k, v in search.iteritems() if v[:1] != '!'}
    negative = {k: v[1:] for k, v in search.viewitems() - positive.viewitems()}
    for item in iterable:
        # Cycle through keys that exist in the search and item
        if len(positive.viewitems() & item.viewitems()) == len(positive):
            if not negative.viewitems() & item.viewitems():
                yield item
所以肯定搜索有一个精确匹配,而否定项都不匹配

针对之前定义的相同输入进行演示:

>>> list(iter_search(demo, C='!US', Sex='m'))
[{'C': 'UK', 'Age': 24, 'Sex': 'm'}]

哈哈。。。我会等5分钟。。。你继续编辑@杰米:是的,当我制作一个演示时,我发现了一些小错误;好了,谢谢。看起来不错,不太好。无论任何其他字段不匹配,一个被否定的字段都会导致匹配。任何非否定搜索都不匹配。
>>> list(iter_search(demo, C='!US', Sex='m'))
[{'C': 'UK', 'Age': 24, 'Sex': 'm'}]