我使用以下脚本来比较Python3中两个单独列表中的元素。如果元素匹配,例如列表1中的元素[0]
与列表2中的元素[0]
匹配,然后变量c
增加1。如果元素不匹配但值在列表中,则会增加另一个变量d
。
我把代码放在一起,但它很长,想知道它是否可以以某种方式压缩。
a = [1,2,3,4]
b = [2,1,3,4]
c = 0
d = 0
if a[0] == b[0]:
c += 1
elif a[0] == b[1] or a[0] == b[2] or a[0] == b[3]:
d += 1
if a[1] == b[1]:
c += 1
elif a[1] == b[0] or a[1] == b[2] or a[1] == b[3]:
d += 1
if a[2] == b[2]:
c += 1
elif a[2] == b[0] or a[2] == b[1] or a[2] == b[3]:
d += 1
if a[3] == b[3]:
c += 1
elif a[3] == b[0] or a[3] == b[1] or a[3] == b[2]:
d += 1
答案 0 :(得分:1)
a = [1,2,3,4]
b = [2,1,3,4]
match = [a[i] == b[i] for i in range(len(a)) if a[i] in b]
c = sum(match)
d = len(match)-c
在此代码中,match
由布尔值组成,用于a
和b
交叉点中每个成员的匹配位置。
此代码的执行方式与问题中的内容类似。但是,如果打算像mastermind游戏一样使用它,这将无法正常工作。例如,如果a=[1,2,3,4]
和b=[4,4,4,4]
匹配指标必须为:1/1
。以下代码可以:
a = [1,2,3,4]
b = [4,4,4,4]
c = sum([a[i] == b[i] for i in range(len(a)) if a[i] in b])
d = sum([min(b.count(item), a.count(item)) for item in set(a)]) - c
类似于以下游戏截图中的第一个猜测:
答案 1 :(得分:0)
您可以使用elif
代替in
语句。让我们看一个例子:
我有这个清单:a = [1, 2, 3]
。 0 in a
会返回False
,但1 in a
会返回True
。
因此,您的代码将如下所示:
a = [1,2,3,4]
b = [2,1,3,4]
c = 0
d = 0
if a[0] == b[0]:
c += 1
elif a[0] in b:
d += 1
if a[1] == b[1]:
c += 1
elif a[1] in b:
d += 1
if a[2] == b[2]:
c += 1
elif a[2] in b:
d += 1
if a[3] == b[3]:
c += 1
elif a[3] in b:
d += 1
答案 2 :(得分:0)
你可以这样做。
c = [e[0]==e[1] for e in [*zip(a,b)]].count(True)
d = [e in b for e in a].count(True) - c
答案 3 :(得分:0)
是的,它可以通过使用for
循环来压缩,你也可以通过执行elseif
(在Python中称为elif
)来使其更高效。 set
。
a = [1,2,3,4]
b = [2,1,3,4]
c = 0
d = 0
b_set = set(b)
for item_from_a, item_from_b in zip(a, b):
if item_from_a == item_from_b:
c += 1
elif item_from_a in b_set:
d += 1
使用zip
一次迭代两个列表,因此它将在第一次迭代中访问a
和b
中的第一个元素(即1
和{{ 1}})在第二次迭代中,它将访问两个列表中的第二个元素(2
和2
),依此类推。你也可以把它写成索引上的循环(它不像使用1
那样“干净”但可能更容易理解):
zip
循环体本身应该相当简单,但如果某些部分需要更多解释,请发表评论。