在Python中模仿findWhere()的行为

3

Underscore提供了一个非常方便的函数 findWhere(),它可以用来在列表(list)中查找特定的结构。

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中找不到类似的东西。有没有一种Pythonic的方式来实现相同的功能?


这个例子似乎可以通过 def findWhere(l, d): return d 轻松解决。你能提供一个更清晰地展示这个函数有用之处的例子吗? - jonrsharpe
2个回答

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'}]

另请参阅 all()列表推导式 以了解表达式的“核心”细节。

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接