如果字典: -
,我不理解计算条件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
答案 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