在Python中模拟findWhere()的行为
Underscore有一个非常实用的小功能,叫做 findWhere(),可以用来在一个列表中找到特定的结构,比如:
myList = [
{'name': 'Thor'},
{'name': 'Odin'},
{'name': 'Freya'},
{'name': 'Skadi'}
];
findWhere(myList, {'name': 'Skadi'});
结果:[{'name': 'Skadi'}]
更好的例子:
my_list = [
{'name': 'Thor',
'occupation': 'God of Thunder',
'favorite color': 'MY HAMMER'}
{'name': 'Skadi',
'occupation': 'Queen of the Ice Giants',
'favorite color': 'purpz'}
]
findWhere(my_list, {'name': 'Skadi'})
结果:
[{'name': 'Skadi',
'occupation': 'Queen of the Ice Giants',
'favorite color': 'purpz'}]
可惜的是,我在Python中找不到类似的功能。用Python有什么好的方法来实现相同的功能呢?
2 个回答
2
我会使用过滤器和一个特殊的条件来筛选子集:
# assuming both key and values are hashable
subset = lambda subset: (lambda superset: set(subset.items()).issubset(set(superset.items())))
results = filter(subset(needle), haystack)
另外,如果字典里的值可能不能被哈希(也就是不能用作字典的键),那么子集的定义就需要是:
subset_nh = lambda subset: (lambda superset: all(item in superset.items() for item in subset.items()))
results = filter(subset_nh(needle), haystack)
5
你可以简单地把这个定义为一个生成器:
def find_where(iterable, dct):
for item in iterable:
if all(item[key] == value for key, value in dct.items()):
yield item
my_list = [
{'name': 'Thor', 'age': 23},
{'name': 'Odin', 'age': 42},
{'name': 'Freya', 'age': 50},
{'name': 'Skadi', 'age': 23},
]
print list(find_where(my_list, {'age': 23}))
输出结果:
[{'age': 23, 'name': 'Thor'}, {'age': 23, 'name': 'Skadi'}]