列表和列表中的项目的Python

时间:2013-07-12 23:02:24

标签: python control-flow

对于某些人来说,这个问题可能非常简单明了,但无论出于何种原因,我都无法在网上找到答案。我没有通过修改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)这是正确的用法吗?如果是这样,它是否凌乱,不安全或不赞成?

6 个答案:

答案 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的两个事实的结果:

  1. 每个对象都是True - ish或False - ish。例如:

    >>> bool(a)
    True
    >>> bool(b)
    True
    

    事实上,除空列表[]之外的所有列表都是True - ish。

  2. Python使用short-circuit evaluation,这意味着,对于a and b,它:

    • 检查aTrue - ish还是False - ish

    • 如果aFalse - ish,则评估为a

    • 如果aTrue - ish,则评估为b

    遵循这些规则,您应该能够了解a and b在您的案例中评估[6, 7, 8, 9, 0]的原因(并遵循实际值True和{{1的组合的相同规则会告诉你短路评估确实有意义。)

  3. 如果你想要实际做的是通过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值,因为您无法迭代TrueTrue,您将获得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中的所有项目”,但是“重新”迭代“在应用和操作时获得的列表中的所有项目列表ab“。

所以你要做的就是后者。您正在使用两个列表ab,然后循环结果。在解释器中,您可以获得ab

>>> 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 bb都不是a或空或b

None0。尝试在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

这将加入两个列表并允许您遍历它。