字典中的计算条件IF

时间:2013-07-23 19:09:06

标签: python dictionary

如果字典: -

,我不理解计算条件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

3 个答案:

答案 0 :(得分: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]

答案 1 :(得分: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)]

从范围(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"]

答案 2 :(得分: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