当还需要有条件地修改密钥时,使用 if else 条件部署字典理解的语法?在这个具体的例子中?

Syntax to deploy for a dictionary comprehension with an if else condition, when also needing to conditionally amend the key? in this specific example?

我有以下数据样式,即字符串列表:

fruits_lst = ['Apple:Good','Banana:Off','Orange:Excellent','Blueberry:Excellent','Raspberry:Good']

我希望通过理解一行代码来实现这个结果:

{'APPLE:GOOD': 'Ripe',
 'BLUEBERRY:EXCELLENT': 'Ripe',
 'Banana:Off': 'Off',
 'ORANGE:EXCELLENT': 'Ripe',
 'RASPBERRY:GOOD': 'Ripe'}

此结果是通过部署以下循环方法实现的:

fruits_dict = {}

for fruit in fruits_lst:

    if fruit.split(':')[1] != 'Off':

        fruits_dict[fruit.upper()] = 'Ripe'

    else:

        fruits_dict[fruit.lower()] = 'Off'

所以这创建了一个字典,但还需要执行不同的函数来根据 fruit.split(':')[1] 值生成所需的键。

我一直在尝试重写它,以便通过理解一行代码来获得相同的结果,但我仍在尝试找出要部署的语法以实现此结果。

我尝试过:

{fruit.upper():'Ripe' for fruit in fruits_lst if fruit.split(':') != 'Off' else fruit.lower():'Off'}

{fruit.upper():'Ripe' if fruit.split(':') != 'Off' else fruit.lower():'Off' for fruit in fruits_lst}

然而,这些都是return语法错误。

我注意到这会产生成熟水果的字典,但我显然错过了不成熟的水果:

{fruit.upper():'Ripe' for fruit in fruits_lst if fruit.split(':') != 'Off'}

{'APPLE:GOOD': 'Ripe',
 'BANANA:OFF': 'Ripe',
 'BLUEBERRY:EXCELLENT': 'Ripe',
 'ORANGE:EXCELLENT': 'Ripe',
 'RASPBERRY:GOOD': 'Ripe'}

我在这里寻找正确的语法,但为了更好地理解它是什么,我在这种情况下应该如何编写通过具有 if else 条件的理解方法生成字典的方法。

谢谢!


问题现在更新了更具体的细节。谢谢!

一种选择是在生成器表达式中使用 OR 并使用字典构造函数:

out = dict((fruit.upper(),'Ripe') * (fruit.split(':')[1]!='Off') or (fruit,'Off') for fruit in fruits_lst)

或者简单地在生成器表达式中实现 if-else 并构造字典:

out = dict((fruit.upper(),'Ripe') if fruit.split(':')[1]!='Off' else (fruit,'Off') for fruit in fruits_lst)

输出:

{'APPLE:GOOD': 'Ripe',
 'Banana:Off': 'Off',
 'ORANGE:EXCELLENT': 'Ripe',
 'BLUEBERRY:EXCELLENT': 'Ripe',
 'RASPBERRY:GOOD': 'Ripe'}

另一个版本:

out = {
    fruit: "Off" if fruit.split(":")[1] == "Off" else "Ripe"
    for fruit in fruits_lst
}

print(out)

打印:

{
    "Apple:Good": "Ripe",
    "Banana:Off": "Off",
    "Orange:Excellent": "Ripe",
    "Blueberry:Excellent": "Ripe",
    "Raspberry:Good": "Ripe",
}

或更短:

out = {
    fruit: "Off" if fruit.endswith(":Off") else "Ripe" for fruit in fruits_lst
}