【问题标题】:How to use a Python list comprehension with a conditional expression如何使用带有条件表达式的 Python 列表推导
【发布时间】:2015-10-04 03:09:55
【问题描述】:

有一个字典,

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

k = 'Frodo'

我想在k存在的时候把k对应的值提取出来,做一个列表。

我写了

value_list = [dlist[i][k] for i in range(len(dlist)) if k in dlist[i] else "NOT PRESENT"]. 

但是计算机说else 是错误的。我不知道为什么。

【问题讨论】:

  • 试试这个 - [dlist[i][k] if k in dlist[i] else "NOT PRESENT" for i in range(len(dlist)) ].
  • 其实一个list有两个dict。

标签: python list-comprehension conditional-statements


【解决方案1】:

当你在列表理解中有else 部分时,将它放在 for 循环之前,示例 -

value_list = [dlist[i][k] if k in dlist[i] else "NOT PRESENT" for i in range(len(dlist))]
value_list
>>> ['Elijah', 'NOT PRESENT']

【讨论】:

  • 如果答案对您有帮助,请点击左侧的勾号,建议您接受答案。
【解决方案2】:

列表推导中for 之后的if 用于过滤列表:当条件为假时,您根本不会得到任何元素。

if..else 在列表推导之前只是一个三元运算符,与任何其他表达式没有区别。

其他几点:for i in range(len(...)) 在 Python 中几乎总是错误的。如果您只迭代一个列表,只需迭代它。 此外,字典有一个方法.get(),您可以使用它来完全避免if。所以:

value_list = [d.get(k, "NOT PRESENT") for d in dlist]

或者如果你更喜欢if:

value_list = [d[k] if k in d else "NOT PRESENT" for d in dlist]

【讨论】:

  • 感谢您的回答。但是为什么“for i in range(len(...))”在python中迭代单个列表是错误的? “迭代”是什么意思?
  • @JihoBaek 他们的意思是您可以将dlist[i][k] for i in range(len(dlist)) 重写为d[k] for d in dlist,因为d 将在迭代时引用列表中的每个元素,而不是使用i 作为索引。
  • @SuperBiasedMan 哦!我知道了!!谢谢
猜你喜欢
  • 2013-08-17
  • 2013-01-26
  • 2017-12-23
  • 1970-01-01
  • 2021-12-20
  • 1970-01-01
  • 1970-01-01
  • 2021-03-15
  • 1970-01-01
相关资源
最近更新 更多