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)那就太好了!
使用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)
c当ref字典是迭代器字典的子集时,这将获取键。这不仅适用于a和b键,还适用于所有情况。
在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)
仅适用于a和b键。
| 归档时间: |
|
| 查看次数: |
120 次 |
| 最近记录: |