Gui*_*ter 1 python list-comprehension
我正在使用一些旧的函数(试图改进旧的代码),然后我开始想知道是否可以直接在列表理解中使用 kwargs。
例如,我有这个数据集:
data = {"channels": [
{"channel_id": 1, "group_id": 1, "description": "First", "default_msg": "Hi!", "status": True},
{"channel_id": 2, "group_id": 1, "description": "Second", "default_msg": "Hi!", "status": True},
{"channel_id": 3, "group_id": 1, "description": "Third", "default_msg": "Hi!", "status": False},
{"channel_id": 4, "group_id": 2, "description": "Fourth", "default_msg": "Hi!", "status": True},
{"channel_id": 5, "group_id": 2, "description": "Fifth", "default_msg": "Hi!", "status": False},
]}
Run Code Online (Sandbox Code Playgroud)
我可以轻松地做类似的事情:
def get_by_groups(group):
return [c for c in data["channels"] if c["group_id"] == group]
Run Code Online (Sandbox Code Playgroud)
但是通过 kwargs 接收查询参数并直接在列表理解中使用它的想法看起来很神奇。我尝试查找示例,但没有成功。
是的,我可以解压所有 kwargs 并为每个参数执行一个循环,但看起来不太好,就像这样:
def get_channels(**kwargs):
return [c for c in data["channels"] if c[kwargs.keys()] == kwargs.values()]
Run Code Online (Sandbox Code Playgroud)
编辑
只是为了澄清。我不认为有什么问题:
def get_channels(**kwargs) -> list:
lst_groups = data["channels"]
for key, value in kwargs.items():
lst_groups = [c for c in lst_groups if c[key] == value]
return lst_groups
Run Code Online (Sandbox Code Playgroud)
这只是好奇心...
你可以这样做:
def get_channels(**kwargs):
return [c for c in data["channels"] if all(c[k]==v for k,v in kwargs.items())]
Run Code Online (Sandbox Code Playgroud)
此行为与您的编辑代码相匹配,其中每个条件都必须得到满足。不同的要求可能会使用any().
不过我会很小心,因为当字段名称作为 kwargs 传递时很容易引入错误。它们必须与里面的内容完全匹配,data['channels']否则你会得到KeyError.
如果这不仅仅是一个内部方法,那么调用者现在需要知道数据结构中使用的确切键,并且将来您将很难在不破坏依赖代码的情况下更改内容。
| 归档时间: |
|
| 查看次数: |
113 次 |
| 最近记录: |