繁体   English   中英

来自 dict 的复杂列表理解

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM