对于某些人来说,这个问题可能非常简单明了,但无论出于何种原因,我都无法在网上找到答案。我没有通过修改IDLE找到答案,并试图理解它是如何工作的。 指定多个项目后 循环如何工作?
a = [1,2,3,4,5]
b = [6,7,8,9,0]
for item in a and b:
print 'why does this setup give the list b but nothing from a?'
后续问题:
1)其他运营商可能会发生什么,例如或和不?
2)这是正确的用法吗?如果是这样,它是否凌乱,不安全或不赞成?
答案 0 :(得分:5)
所以,你有两个清单:
>>> a = [1,2,3,4,5]
>>> b = [6,7,8,9,0]
...并且您希望迭代a and b
。那么 a and b
究竟是什么?
>>> a and b
[6, 7, 8, 9, 0]
这可能看起来很奇怪,但这是关于Python的两个事实的结果:
每个对象都是True
- ish或False
- ish。例如:
>>> bool(a)
True
>>> bool(b)
True
事实上,除空列表[]
之外的所有列表都是True
- ish。
Python使用short-circuit evaluation,这意味着,对于a and b
,它:
检查a
是True
- ish还是False
- ish
如果a
为False
- ish,则评估为a
如果a
为True
- ish,则评估为b
遵循这些规则,您应该能够了解a and b
在您的案例中评估[6, 7, 8, 9, 0]
的原因(并遵循实际值True
和{{1的组合的相同规则会告诉你短路评估确实有意义。)
如果你想要实际做的是通过False
中的项目然后a
中的项目进行迭代,你可以使用b
运算符来连接它们:
+
关于你的后续问题:
其他运营商可能会遇到什么情况,例如
>>> for item in a + b: ... print item, ... 1 2 3 4 5 6 7 8 9 0
和or
?
not
的短路评估规则有所不同(您可以自行查看或只是按照上面的链接),在您的情况下,or
评估为a or b
(换句话说,[1, 2, 3, 4, 5]
)。
a
始终返回not
表示True
- ish值,False
表示False
- ish值,因为您无法迭代True
或True
,您将获得False
。
这是正确的用法吗?如果是这样,它是否凌乱,不安全或不赞成?
嗯,没有什么不合法的,但正如你所看到的,它没有做你想要的。在某些情况下,(ab)使用短路评估来选择迭代的迭代可能会有所帮助,但这不是其中之一。
答案 1 :(得分:4)
正如您所发现的,当指定多个项目时,for循环不起作用!你得到的是迭代a and b.
a and b
如果两个项都为真,则返回True;在这种情况下,它是最右边的操作数,因为它知道它是真的。正确的方法是使用itertools.chain:
for item in itertools.chain(a, b):
print 'now we get both lists'
答案 2 :(得分:1)
这似乎是Pythons使用英语单词最终令人困惑的情况。语句for item in a and b
并不意味着“迭代a
中的所有项目,然后b
中的所有项目”,但是“重新”迭代“在应用和操作时获得的列表中的所有项目列表a
和b
“。
所以你要做的就是后者。您正在使用两个列表a
和b
,然后循环结果。在解释器中,您可以获得a
和b
>>> a = [1,2,3,4,5]
>>> b = [6,7,8,9,0]
>>> a and b
[6, 7, 8, 9, 0]
您当然可以为任何操作执行此操作,但它仍然只是在for
循环之前应用。
要依次循环遍历两个列表,请将and
操作替换为+
以将它们放在一起,将它们连接起来。喜欢这个
>>> a + b
[1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
>>> for item in a + b:
... print item,
...
1 2 3 4 5 6 7 8 9 0
答案 3 :(得分:1)
代码a and b
不加入两个列表,它执行逻辑和操作。逻辑和两个真值(例如列表)的计算结果为第二个参数的值。如果使用or运算符,则计算为第一个非false值。对于非真值,使用not将评估为True,对于真值,则评估为False。通常情况下,使用an和或或除布尔值以外的任何值都是不受欢迎的。
有几种方法可以完成你想要做的事情。最简单的是循环遍历a + b
- 这会为您提供一个新列表。如果您的列表很大,您可以考虑使用itertools.chain(),它可以让您遍历所有值而无需创建新的列表对象。
答案 4 :(得分:0)
a and b
和b
都不是a
或空或b
, None
会0
。尝试在Python shell中键入1 and 2
。
尝试:
a = [1,2,3,4,5]
b = [6,7,8,9,0]
for item in a + b:
print item
您可以使用+
运算符连接列表。
答案 5 :(得分:0)
你也可以这样做:
for i in a + b:
print i
这将加入两个列表并允许您遍历它。