[英]Complicated list comprehension from dict
在谷歌上搜索了一下并阅读了其他一些 SO 帖子(特别是这个)之后,我似乎找不到一个可行的解决方案。
我有一个循环如下:
json_preferred = []
for score, terms in profile.preferred.items():
for term in terms:
json_preferred.append({"key": term, "value": score})
基本上我有一个字典,其中的值是列表。 对于字典中的每个键,我需要在另一个列表中创建一个字典,将字典键和每个值作为具有固定键的值。
这有点难以用语言表达,但希望上面的代码更容易解释。 对于上下文,所有这些的 output 是一个 JSON 结构,稍后将在 RESTA167423CED018A 请求中使用。
我想用某种列表理解替换上面的代码。 但是,我最初的尝试失败了:
json_preferred = [{"key": term, "value": score} for term in terms for score, terms in profile.preferred.items()]
这失败了:
NameError:名称“术语”未定义
大于 1 维的 dict/list 理解让我非常困惑。 所以我不确定我在这里做错了什么。 我正在使用 Python 3.9.1。
要形成一个推导式,请将嵌套循环展平并将其主体移动到推导式的开头:
json_preferred = []
for score, terms in profile.preferred.items():
for term in terms:
json_preferred.append({"key": term, "value": score})
...变成:
json_preferred = [
{"key": term, "value": score}
for score, terms in profile.preferred.items()
for term in terms
]
您需要itertools.chain()
或functools.reduce()
来将该嵌套循环表示为一个列表理解,该列表理解会展平为一个列表。
这是一种奇特的说法,如果您想保持代码的可读性,您可能不应该尝试将其表达为列表理解。
取自您链接的问题(进行了一些修改):
lst = [] for i, j in s1: for k in s2: lst.append({i: k})
变成:
lst = [{i: k} for i, j in s1 for k in s2]
在您的情况下,我们有:
i, j = score, terms
s1 = profile.preferred.items()
k = term
s2 = j = terms
根据上述给出:
lst = [{score: term} for score, terms in profile.preferred.items() for term in terms]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.