在列表理解中使用'if'

时间:2017-11-30 14:29:41

标签: python list list-comprehension

我正在通过Norvig's BASIC interpreter implemented in Python

有一些代码似乎与我无关,但这个人似乎超出了我的100级,所以我更有可能无法理解而不是写了不必要的东西。

def lines(text): 
    "A list of the non-empty lines in a text."
    return [line for line in text.splitlines() if line]
    #return [zaa for zaa in text.splitlines()]

列表理解 - 为什么它以if line结束?

如果我删除该子句,改为使用[zaa for zaa in text.splitlines()],我仍然认为如果我传递文本甚至空白行,该函数是否有效。

foo ="""mike\nnew\nbar"""
bar ="\n\n"
print lines(foo)
print lines(bar)
what = lines(bar)
print(type(what))

['mike', 'new', 'bar']
[]
<type 'list'>

我必须误解某些东西 - 我无法理解何时评估if line,更不用说正确处理输入的必要性。

编辑:找到缺少if line会导致错误结果的示例:

bar ="""one
two
three

five

seven"""
#bar = ""
print lines(bar)

['one', 'two', 'three', '', 'five', '', 'seven']

它包含这两个空字符串作为列表的成员。

2 个答案:

答案 0 :(得分:8)

if line正在检查&#34; truthy&#34;值,选中时确定为FalseTrue的字符。例如,空字符串''被视为False,空列表([]),字典({}),元组(()),{ {1}}和0。基本上,None是较短版本:

if line

答案 1 :(得分:2)

简短回答从结果中过滤掉空字符串

在Python中,列表理解的形式为:

[<expr> for <vars> in <iterable> <filters-and-iterators>]

其中<filters-and-iterators>是序列:

  1. for <vars> in <iterable>形式的迭代器;和
  2. 表格 if <expr>
  3. 过滤
  4. Python将评估的 真实性 。只有在表达式具有真实性 True的情况下,它才会传递该元素:如果过滤器是最后一步,则意味着将其添加到列表中;如果过滤器不是最后一步,则进一步处理(例如处理下一个迭代器或过滤器)。否则它将忽略该项目。

    str 真实性 True当且仅当字符串包含至少一个字符时。所以这意味着我们过滤掉非空字符串。

    可以通过覆盖__bool__魔术函数来实现自定义类的真实性,或者如果它丢失,Python将查看__len__是否返回非零值。

    NoneFalse始终保持真实性FalseTrue具有真实性True,列表,集合,词典,元组和字符串等集合具有真实性{ {1}}当且仅当这些包含至少一个元素时。如果数值非零,则数值通常具有真实性True(因此负数也具有真实性True)。

    程序员可以自由地为自定义类本身实现真实性(如上所述),尽管将这里的示例考虑在内并因此将非空虚视为集合的真实性通常是个好主意。