字典中的计算条件

2024-06-01 08:02:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我不明白计算条件IF如果字典:-

为什么当代码

dlist = [{'Bilbo':'Ian','Frodo':'Elijah'} , {'Bilbo':'Martin','Thorin':'Richard'}]

k = 'Bilbo'

[ ks[k] if k in ks else 'NOT PRESENT' for ks in dlist]

但是我写代码的时候

[ ks[k]  for ks in dlist if k in ks else 'NOT PRESENT' ] 

我得到一个SyntaxError: invalid syntax


Tags: 代码inforif字典not条件else
3条回答

@Mikhail,我理解你对这个问题的看法,这不是一个“我的代码不起作用”的问题,而是一个“Python为什么这样做?”。我也被它绊倒了一段时间,让我绊倒的是我把它当成了一个作业语句,例如:

my_greeting = "Good morning" if is_morning else "Good Evening"

这完全是字面意思:“给我“早上好”如果…,否则给我“晚上好”并绑定到我的问候语。像这样的赋值语句很常见,在其他类似C的语言中,它们甚至有专门用于此的turnary运算符。然而,这在列表理解中是不一样的。你知道吗

列表理解(在Python中)的查看(和阅读)方式应该略有不同。你知道吗

time_of_day = ["AM", "AM", "PM", "AM"]
def is_morning(x):
    return True if x == "AM" else "False"

my_greetings = ["Good Morning" if is_morning(x) else "Good Evening" for x in time_of_day]

现在我们需要以不同的方式来“解读”,因为逻辑略有不同。我总是从右手边开始(我知道应该从左到右读,但我想知道我们首先要处理的是什么)。所以我会读到:

1. from the sequence 'time_of_day', draw x
2. for each x in 'time_of_day' give me "Good Morning", otherwise "Good Evening" (based on the predicate)

更简单的描述是:

my_even_numbers = [x if not (n % 2) else "Odd" for x in range(1, 100)]

它从范围(1100)中抽取x,并测试它是否为偶数。你知道吗

现在真正恼人的是,我完全同意你的逻辑基础!阅读:[x from xs, if (conditions...)]对我来说更有意义,其他语言(比如Haskell)就是这样做的。但不是Python。长话短说,语法就是语法,我们必须遵守它:)


作为比较,这里有一个使用Haskell的类似示例,我认为它更符合您描述的思考方式(表达式,后跟条件):

myGreeting x = if x == "AM"
                    then "Good Morning"
                    else "Good Evening"

或者作为仅对“AM”作出反应的列表理解:

timeOfDay = ["AM", "AM", "PM", "AM"]
goodMorning = [(myGreeting x) | x <- timeOfDay, x == "AM"]

你的代码不太管用。正如我在第一行中所理解的,我们将值与键进行比较。你知道吗

[(ks[k] for ks in dlist) if k in ks else 'NOT PRESENT']
[ks[k] for ks in (dlist if k in ks else 'NOT PRESENT')]
NameError: name 'ks' is not defined
[ks[k] if k in ks else 'NOT PRESENT' for ks in dlist]    

暗示

[(ks[k] if k in ks else 'NOT PRESENT') for ks in dlist] 

你的提议

[ ks[k]  for ks in dlist if k in ks else 'NOT PRESENT' ]

不能以合理的方式隐式放置这些括号。下面是对语法进行分组的各种方法。他们中没有一个能达到你的目的:

[(ks[k] for ks in dlist) if k in ks else 'NOT PRESENT']
[ks[k] for ks in (dlist if k in ks else 'NOT PRESENT')]
[ks[k] for ks in dlist if k in ks]

相关问题 更多 >