'for'循环说明请求

时间:2016-04-26 10:19:47

标签: python loops for-loop conditional

我最近开始学习python。 所以我写了一些小代码,这段代码要求2个大小的列表,用0-9创建2个随机整数的列表,然后吐出两个列表之间的交集。

最后一个“for”循环 - 我遇到了麻烦,因为起初我的“十字路口”列表有重复,然后我找了一个答案,得到了我现在的东西,它有效,但我不知道为什么。我的问题是抓住“在l1和l2中为我”的工作方式? 我知道“对于我在范围(k)中”是通过数字0-k但是这个奇怪的循环与“和”运算符只是困惑我。

l1 = []
l2 = []
C = []
s1 = int(input("Your 1st list size->"))
s2 = int(input("Your 2nd list size->"))
for i in range(s1):
    from random import randint
    k = (randint(0,9))
    l1.append(k)
print("First List ->" , l1)
for i in range(s2):
    from random import randint
    k = (randint(0,9))
    l2.append(k)
print("Second List ->" , l2)
for i in l1 and l2:
    if i in l1 and l2:
        C.append(i)

print("Intersection ->" , C)

如果有其他地方提交此类问题,请告知我们(如果这些问题不合适的话)。

3 个答案:

答案 0 :(得分:1)

为了理解for循环如何工作,我们需要检查结果l1 and l2的结果。在Python中,非空容器将在布尔上下文中评估True,而空容器分别为False

>>> bool([])
False
>>> bool([1])
True

然后and运算符将返回第一个参数,以防它在布尔上下文中False,第二个参数在第一个参数计算为True的情况下返回:

>>> [] and [1]
[]
>>> [2] and [1]
[1]

根据上述信息,我们知道for i in l1 and l2:中的l2结果项在l1非迭代的情况下被迭代。如果l1为空,则分别循环甚至不会单次运行。

在循环内if i in l1 and l2:评估True,以防i l1 l2 l2l2并非i,但执行不会如果l1不包含单个项目,则结束此处。由于循环仅迭代for i in l2: if i in l1: C.append(i) 上的项目并检查set中是否存在>>> set([1,2,3]) & set([4,5,1]) set([1]) ,因此它将生成交集。请注意,您可以使用以下代码获得相同的结果:

l2

您可以查看Your 1st list size->4 Your 2nd list size->4 First List -> [8, 8, 0, 2] Second List -> [0, 4, 0, 3] Intersection -> [0, 0] >>> set([8, 8, 0, 2]) & set([0, 4, 0, 3]) set([0]) ,以便更简单地生成交叉点:

sudo npm cache clean

请注意,由于集合是唯一项目的集合,因此sudo npm install -g cordova包含同一项目的多个副本时结果会有所不同:

npm

答案 1 :(得分:1)

此代码非常具有误导性,因此您可以理解,您感到困惑。以下代码片段是问题:

for i in l1 and l2:
    if i in l1 and l2:
        C.append(i)

这实际上等同于以下内容:

for i in l2:
    if i in l1:
        C.append(i)

for语句中,分组为for i in (l1 and l2)。换句话说,评估l1 and l2,并使用结果列表。如果l1非空,那么这只是l2。如果l1为空,那么它就是一个空列表[],但这样可行,因为在这种情况下,交集必须为空。

if语句中,分组为if (i in l1) and l2。如果l2非空,那么如果i in l1为真,那么这将是有效的。如果l2为空,这将始终是有效的,但同样,这是有效的,因为在这种情况下,交集必须为空。

请注意,可以通过为l1创建一个集来加速循环体。这将使成员资格测试在l1

的长度内基本上保持恒定时间而不是线性
s1 = set(l1)
for i in l2:
    if i in s1:
        C.append(i)

您还可以使用列表推导来获得等效结果,分配给C而不是附加到它:

s1 = set(l1)
C = [i for i in l2 if i in s1]

答案 2 :(得分:0)

假设两个列表都是非空的:

l1 and l2 == l2

因此你写的是:

for i in l2:
   if i in l1 and l2:
        c.append(i)

这是有道理的。

如果我是你,我会调查python集:

s1 = set(l1); s2 = set(l2)
intersection = list(s1.intersection(s2))