【问题标题】:the calculation conditions IF in dictionaray [closed]字典中的计算条件IF [关闭]
【发布时间】:2013-07-23 00:59:30
【问题描述】:

不明白计算条件IF if dictionary :-

为什么当代码

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

【问题讨论】:

  • 因为,这就是语法?
  • 我不明白为什么。首先应该开始条件 For 然后只有条件 If 。我说的对吗?
  • +1 表示问题的概念。这与“工作代码”无关——@Mikhail 有工作代码。这就是为什么 Python 以这种方式构建它的原因。也许对程序员来说这是一个更好的问题,但仍然是一个有趣的问题。

标签: python dictionary


【解决方案1】:
[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]

【讨论】:

  • 谢谢。你的答案很清楚
【解决方案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"]

【讨论】:

  • 感谢您的解释。例如代码是正确的,但我使用了相同的逻辑 S = {-4, -2, 1, 2, 5, 0} zero_sum_list = [ (x,y,z) for x in S for y in S for z in S if sum((x,y,z))==0 ]
  • 下面代码中的主要错误是将值与字典中的键进行比较。用 List 我的逻辑是正确的
【解决方案3】:

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

[(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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-01
    • 2012-11-25
    • 1970-01-01
    • 1970-01-01
    • 2011-12-28
    • 1970-01-01
    • 2021-10-18
    • 1970-01-01
    相关资源
    最近更新 更多