Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python列表理解中的附加条件 < >如何使用列表理解将所有开始的空项删除,而不是删除列表中间的空元素。这是一个例子: desc = [] desc.append('') desc.append('') desc.append('') desc.append('line 1') desc.append('line 2') desc.append('') desc.append('') desc.append('line 3') filtered = [x for x in desc if x] filtered ['line 1', 'line 2', 'line 3']_Python_List Comprehension - Fatal编程技术网

Python列表理解中的附加条件 < >如何使用列表理解将所有开始的空项删除,而不是删除列表中间的空元素。这是一个例子: desc = [] desc.append('') desc.append('') desc.append('') desc.append('line 1') desc.append('line 2') desc.append('') desc.append('') desc.append('line 3') filtered = [x for x in desc if x] filtered ['line 1', 'line 2', 'line 3']

Python列表理解中的附加条件 < >如何使用列表理解将所有开始的空项删除,而不是删除列表中间的空元素。这是一个例子: desc = [] desc.append('') desc.append('') desc.append('') desc.append('line 1') desc.append('line 2') desc.append('') desc.append('') desc.append('line 3') filtered = [x for x in desc if x] filtered ['line 1', 'line 2', 'line 3'],python,list-comprehension,Python,List Comprehension,下面是一个简单的列表理解,可以删除所有空项: filtered = [x for x in desc if x != ''] 我试图通过列表理解实现的目标与此类似: for i in enumerate(desc): if desc[0].strip() == '': desc.pop(0) 内置函数next只会迭代,直到在desc列表中找到非空元素。一旦找到一个元素,它将停止迭代,并将从该元素返回列表直到结束,而不是迭代整个描述列表 >>> he

下面是一个简单的列表理解,可以删除所有空项:

filtered = [x for x in desc if x != '']
我试图通过列表理解实现的目标与此类似:

for i in enumerate(desc):
    if desc[0].strip() == '':
        desc.pop(0)

内置函数
next
只会迭代,直到在desc列表中找到
非空元素。一旦找到一个元素,它将停止迭代,并将从该元素返回列表直到结束,而不是迭代整个描述列表

>>> help(next)
Help on built-in function next in module __builtin__:

next(...)
    next(iterator[, default])

    Return the next item from the iterator. If default is given and the iterator
    is exhausted, it is returned instead of raising StopIteration.
使用:

除了lambda之外,您还可以使用@JonClements建议的:

>>> from operator import not_

>>> list(dropwhile(not_, lines))
['line1', 'line2', '', '']

也许你可以把你写的东西翻译成列表理解

filtered = desc[:]
crap = [filtered.pop(0) for i in filtered if filtered[0].strip()==""]

其他解决方案也不错。如果列表理解是不必要的,那么也许你可以尝试这种单行法

>>> desc
['', '', '', 'line 1', 'line 2', '', '', 'line 3']
>>> 
>>> ';'.join(desc).lstrip(';').split(';')
['line 1', 'line 2', '', '', 'line 3']
>>> 
步骤1-通过某个分隔符连接列表的所有元素

>>> x = ';'.join(desc)
';;;line 1;line 2;;;line 3'
步骤2-从字符串的开头删除分隔符

>>> x = x.lstrip(';')
'line 1;line 2;;;line 3'
步骤3-拆分分隔符上的字符串以获得输出

>>> x.split(';')
['line 1', 'line 2', '', '', 'line 3']

只有在决定包含哪些元素取决于每个单元素本身的属性时,列表理解才是编写结果列表创建的好方法

如果条件取决于其他因素(例如,结果中的位置),则显式循环可能更具可读性(可读性是列表理解的要点)

良好使用示例:

  • 列表的所有偶数
  • 大小大于一定数量的所有对象
  • 并非所有元素都为空
不符合理解概念的示例:

  • 前五个偶数(不适合理解,“前五个”部分不依赖于每个元素)
  • 删除列表开头的空元素(条件取决于其他元素)
  • 唯一元素,即如果元素多次出现,则仅保留第一个元素(关于元素的决定取决于以前的决定)

当然,你可以尝试滥用理解来做一些他们不打算做的事情,但是如果结果代码的可读性不如显式写出算法那么就没有理由这样做。

这也会删除列表中间的空字符串。我希望他们留下来。我只想在第一个列表中删除空项。这不是一个真正的列表理解问题,因为你只需要查看第一个元素。如果列表中的第一个元素为空,你只想删除它吗?是的,只是列表开头的空项。但我认为使用列表理解可能是可行的。列表理解并不适用于你想用列表完成的所有任务。任何一个输出在成为普通循环的作业之前依赖于这些输出的内容。@user2357112-看看Peter Wood的答案。也可以从操作符import not
执行
,然后执行
列表(dropwhile(not,line))
这就是我所说的出色解决方案。谢谢,但是你也可以使用itertools模块和dropwhile,正如彼得·伍德所演示的那样。@TonySuffolk66:就像我说的,如果你真的喜欢,你可以滥用理解,但为什么要这样做呢?请记住,可读性是关键。当然,例如,将“前五个偶数”的问题分为“前五个”和“偶数”对于可读性来说是可以的,对于生成器的性能来说也是可以的(但对于理解来说,它会提取所有偶数以只保留前五个,这可能是个坏主意)我不认为使用像ItraseToC之类的标准库来滥用理解。@ TyySuffoK66:这个答案根本不使用列表理解。
>>> x = x.lstrip(';')
'line 1;line 2;;;line 3'
>>> x.split(';')
['line 1', 'line 2', '', '', 'line 3']