python 中带有 csv 文件的 any() 函数不符合我的预期
any() function with csv file in python not behaving how I'm expecting it to
(我现在使用的是 python 2.7)
所以也许我不明白这行代码是如何工作的,因为对于我的程序的一部分,它似乎工作正常,而在另一部分,它却没有。
elif not any(user in line for line in data):
基本上,我有一个 csv 文件,我正在读取它并将其存储在变量 "data" 中,如下所示:
f = open("scores.csv")
data = csv.reader(f)
变量"user"是来自Tkinter输入框的字符串,
并且变量 "line" 是 for 循环的任意名称,就像在一段代码中说 "for i in range(69):"
所以我的大脑认为这一行应该做的是,如果它在 csv 文件的任何行中找不到匹配的用户,它应该 运行 该语句下的代码。但它似乎并没有这样做!
但是,稍后在我的代码中我尝试了类似的东西:
elif any(user in line for line in data):
这似乎没有任何问题!!
我不知道为什么,而且我在互联网上找不到任何其他人试图这样做的地方,哈哈。
我正在尝试制作一个登录表单作为初学者项目,因为我有点了解 python,所以我想看看我能做什么,但我似乎被困在这里。
我已经将我的代码上传到 github 以供任何人查看:
https://github.com/Arunscape/login-form/blob/master/login.py
哦,不用担心 csv 文件中的 "passwords",它们当然是假的!
感谢任何帮助。谢谢!!!
你遇到的问题是 data
是一个迭代器,而不是一个你可以多次迭代的序列。在使用遍历 data
的生成器表达式调用 any
后,部分或全部项目将被消耗。以后的调用只会看到剩下的东西(如果第一次迭代必须检查所有数据,这可能什么都不是)。
您可以使用更简单的代码重现该问题:
iterator = iter(range(10)) # an iterator over the numbers 0 through 9
first_result = any(x == 3 for x in iterator) # this will be True
second_result = any(x == 3 for x in iterator) # the same expression will be False this time!
第一个 any
调用消耗(通过生成器表达式)来自迭代器的数字 0
到 3
。然后它停止并且 any
returns True
(以这种方式提前停止被称为 "short circuiting")。
第二个 any
调用只能消耗剩余的项目,它看不到第一个 any
调用已经产生的项目。由于迭代器只会产生一个 3
,第二个 any
调用将在消耗完其余数字后 return False
。
为了让您的代码在 data
作为迭代器的情况下正常工作,您只能迭代一次。
如果您的 csv
文件中没有太多值,您最好将所有行读入一个列表,您可以根据需要迭代任意多次。尝试:
data = list(csv.reader(f))
不过,将数据解析为更有意义的数据结构可能更有意义,而不是列表(例如,将用户名映射到密码的字典,您可以在 O(1)
时间内查询而不是 O(N)
时间).
(我现在使用的是 python 2.7) 所以也许我不明白这行代码是如何工作的,因为对于我的程序的一部分,它似乎工作正常,而在另一部分,它却没有。
elif not any(user in line for line in data):
基本上,我有一个 csv 文件,我正在读取它并将其存储在变量 "data" 中,如下所示:
f = open("scores.csv")
data = csv.reader(f)
变量"user"是来自Tkinter输入框的字符串, 并且变量 "line" 是 for 循环的任意名称,就像在一段代码中说 "for i in range(69):"
所以我的大脑认为这一行应该做的是,如果它在 csv 文件的任何行中找不到匹配的用户,它应该 运行 该语句下的代码。但它似乎并没有这样做!
但是,稍后在我的代码中我尝试了类似的东西:
elif any(user in line for line in data):
这似乎没有任何问题!! 我不知道为什么,而且我在互联网上找不到任何其他人试图这样做的地方,哈哈。
我正在尝试制作一个登录表单作为初学者项目,因为我有点了解 python,所以我想看看我能做什么,但我似乎被困在这里。
我已经将我的代码上传到 github 以供任何人查看: https://github.com/Arunscape/login-form/blob/master/login.py
哦,不用担心 csv 文件中的 "passwords",它们当然是假的!
感谢任何帮助。谢谢!!!
你遇到的问题是 data
是一个迭代器,而不是一个你可以多次迭代的序列。在使用遍历 data
的生成器表达式调用 any
后,部分或全部项目将被消耗。以后的调用只会看到剩下的东西(如果第一次迭代必须检查所有数据,这可能什么都不是)。
您可以使用更简单的代码重现该问题:
iterator = iter(range(10)) # an iterator over the numbers 0 through 9
first_result = any(x == 3 for x in iterator) # this will be True
second_result = any(x == 3 for x in iterator) # the same expression will be False this time!
第一个 any
调用消耗(通过生成器表达式)来自迭代器的数字 0
到 3
。然后它停止并且 any
returns True
(以这种方式提前停止被称为 "short circuiting")。
第二个 any
调用只能消耗剩余的项目,它看不到第一个 any
调用已经产生的项目。由于迭代器只会产生一个 3
,第二个 any
调用将在消耗完其余数字后 return False
。
为了让您的代码在 data
作为迭代器的情况下正常工作,您只能迭代一次。
如果您的 csv
文件中没有太多值,您最好将所有行读入一个列表,您可以根据需要迭代任意多次。尝试:
data = list(csv.reader(f))
不过,将数据解析为更有意义的数据结构可能更有意义,而不是列表(例如,将用户名映射到密码的字典,您可以在 O(1)
时间内查询而不是 O(N)
时间).