Python 如何使用此iterable函数取消对列表的搜索?
我编写了一个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
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'}]