-7

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

4

3 回答 3

2
[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]
于 2013-07-23T19:15:02.033 回答
2

@Mikhail,我理解您对此的想法,这与其说是“我的代码不起作用”的问题,不如说是“为什么 Python 会这样做?”。我也被它绊倒了一段时间,让我绊倒的是我认为它就像一个赋值语句,例如:

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

这完全是字面意思:“如果……给我“早安”,否则给我“晚安”并将其绑定到 my_greeting”。像这样的赋值语句很常见,在其他类似 C 的语言中,它们甚至有专门用于此的四元运算符。然而,这在列表推导中是不一样的。

列表推导(在 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)]

它从 range(1, 100) 中提取 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"]
于 2013-07-23T19:35:34.343 回答
1

你的代码也不起作用。正如我在第一行中所了解的,我们将值与键进行比较。

[(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
于 2013-07-23T19:32:43.240 回答