我最近开始学习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)
如果有其他地方提交此类问题,请告知我们(如果这些问题不合适的话)。
答案 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
l2
,l2
并非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))