老实说,我在这里有点困惑,为什么我不能在相同的数据上迭代两次?
def _view(self,dbName):
db = self.dictDatabases[dbName]
data = db[3]
for row in data:
print("doing this one time")
for row in data:
print("doing this two times")
Run Code Online (Sandbox Code Playgroud)
这将打印出"一次这样做"几次(因为数据有几行),但它根本不会打印出"这样做两次"......
我第一次迭代数据工作正常,但第二次当我运行最后一个列表"for data in data"时,这没有返回...所以执行它一次工作但不是两次......?
仅供参考 - 数据是一个csv.reader对象(如果是这样的原因)......
(使用Python 3.1)
我知道这个问题已经问过很多关于测试迭代器是否为空的一般问题了。显然,没有解决方案(我想是有原因的-迭代器直到被要求返回下一个值才真正知道它是否为空)。
但是,我有一个特定的示例,希望我可以用它编写干净的Pythonic代码:
#lst is an arbitrary iterable
#f must return the smallest non-zero element, or return None if empty
def f(lst):
flt = filter(lambda x : x is not None and x != 0, lst)
if # somehow check that flt is empty
return None
return min(flt)
Run Code Online (Sandbox Code Playgroud)
有什么更好的方法吗?
编辑:抱歉的愚蠢表示法。函数的参数确实是一个任意可迭代的,而不是列表。
我在 Python 3.4.3 中遇到了一个奇怪的问题,似乎没有任何地方提到它。
让我们说:
a = [1,2,3,4]和b = [5,6,7,8]
要垂直连接这些:ab = zip(a,b)
在 python 3 中,ab它本身将返回:
zip 对象位于(一些十六进制数)
一切都好,在python 3中,检索连接列表:
aabb = list(ab)
现在问题来了,第一次,aabb确实会返回一个真正的列表:
[(1, 5), (2, 6), (3, 7), (4, 8)]
然而,第二次及以后,如果你再次执行整个过程,list(aabb)只会返回一个空[]容器,就像list()会做的那样。
只有在我重新启动 shell/解释器后它才会再次工作。
这是正常现象还是bug?
编辑:玉家伙我并没有意识到这是一起做的zip,它似乎常数ab返回相同的十六进制值,每次所以我认为这是一起做的list(ab)。
无论如何,通过重新分配解决了 ab = zip(ab)
根据我在答案和原始链接中的理解,ab一旦阅读就会被处理掉。