将参考字典与字典列表相匹配

Dic*_*oyT 2 python dataframe pandas

所以我有一个参考字典

ref = {"a": 1, "b": 2}
Run Code Online (Sandbox Code Playgroud)

和一个字典列表

dict_list = [{"a": 1, "b": 2, "c": "success!"}, {"a": 1, "b": 3, "c": "nope!"}]
Run Code Online (Sandbox Code Playgroud)

dict_list我想要的是找到与 erence匹配的字典ref,并返回值c(即"success!")。我能够做到这一点,但我根本不喜欢这个解决方案:

In [7]: import pandas as pd
   ...: def f(ref, dict_list):
   ...:     df = pd.DataFrame.from_records(dict_list)
   ...:     return df.loc[(df["a"] == ref["a"]) & (df["b"] == ref["b"])].c[0]
   ...: 
   ...: f(ref, dict_list)
Out[7]: 'success!'
Run Code Online (Sandbox Code Playgroud)

如果有人有更优雅的东西(最好是纯Python)那就太好了!

U10*_*ard 5

使用next

>>> next((x['c'] for x in dict_list if ref.items() < x.items()))
'success!'
>>> 
Run Code Online (Sandbox Code Playgroud)

或者:

>>> next((x['c'] for x in dict_list if dict(x, **ref) == x))
'success!'
>>> 
Run Code Online (Sandbox Code Playgroud)

cref字典是迭代器字典的子集时,这将获取键。这不仅适用于ab键,还适用于所有情况。

在Python 3中,要检查一个字典是否是另一个字典的子集,可以使用<运算符。

对于第二种情况,由于字典不能有额外的键,因此它连接两个字典并确定它是否与原始字典迭代器相同,如果是,则从citerator 生成键x

编辑:

正如 @sj95126 提到的,从 Python 3.9 开始,您可以使用串联方法:

>>> next((x['c'] for x in dict_list if x | ref == x))
'success!'
>>> 
Run Code Online (Sandbox Code Playgroud)

这和 是一样的逻辑dict(x, **ref)

编辑2:


显然,你可以这样做:

>>> next((x['c'] for x in dict_list if [x['a'], x['b']] == list(ref.values())))
'success!'
>>> 
Run Code Online (Sandbox Code Playgroud)

仅适用于ab键。