我想从这个列表中得到唯一的非None元素:
L = [None, [None,None], [None, <__main__.Car object at 0x02A11550>], [None, None, None], None]
我试过了
^{pr2}$但结果是
[[None, None], [None, <__main__.Car object at 0x02A11550>], [None, None, None]]
只删除不在任何列表中的“无”。 有没有办法把整个名单都清理干净?所以输出是
<__main__.Car object at 0x02A11550>
另一种稍微模块化的方法:
通用的
flatten
函数应该保存在工具箱中,因为(到目前为止)在标准库中找不到它,而且它偶尔会出现。在我先从发电机开始,给你讲讲。
^{pr2}$yield
关键字是return
的姐妹,但功能有很多不同。这两个函数都用于将值从函数中带到它的调用范围,但是yield
允许您以后跳回函数中!例如,下面是一个生成器,它接受一个充满数字的列表,并为列表中的每个数字生成正方形。在不过,发电机是一次性的。如您所见,在我到达生成器的末尾之后,它抛出了一个异常
StopIteration
。如果我再次构建它并用一个循环运行它,然后尝试再次运行它。。。在第二次它什么也做不了。发电机耗尽。这就是缺点,优点是使用生成器而不是列表通常要快得多,内存效率也更高。在
yield
还允许您使用另一个关键字:from
。在嵌套列表的情况下,我就是这样做的(hasattr(element,"__iter__")
只是表示元素有一个属性.__iter__
,这意味着可以使用类似for
循环的方式对其进行迭代)。您给yield from
另一个生成器,它依次从该生成器生成每个元素。例如:它的作用是:
所以上面的代码基本上是这样的(在伪代码中):
当您调用它时,它将构建一个可以迭代的生成器。要使它成为一个正式的列表,您必须执行
list(flatten(L))
,但在大多数情况下,您不需要这样做。在清楚了吗?在
只是为了好玩,不如:
这将返回一个只有
Car
元素的list
。它将泛化为返回带有任何非None
元素的list
。在在python3.x中,我认为您可以将},并且它的工作原理是一样的。在
ifilterfalse
替换为{chain()
被设计成使list
的一个list
变平以进行迭代。ifilterfalse
可以直接在返回的{ifilterfalse
删除与lambda
函数指定的谓词匹配的元素。在注意,如果在
L
中有字符串,chain()
实际上将把字符串分解成单独的元素。如果这对您来说是个问题,请参阅另一个SO post。在另一种避免了基本级别不可移植问题的实现:
^{pr2}$我被告知这在Python3中可能行不通,因为
str
是如何实现的。无论如何,我只是发布这些想法,这样您就可以了解到Python标准库中itertools
下已经提供的功能。学习Python愉快!在相关问题 更多 >
编程相关推荐