比较列表中的元素

时间:2017-08-14 10:09:29

标签: python list comparison

我使用以下脚本来比较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

4 个答案:

答案 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由布尔值组成,用于ab交叉点中每个成员的匹配位置。

此代码的执行方式与问题中的内容类似。但是,如果打算像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

类似于以下游戏截图中的第一个猜测:

masetermind example

答案 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一次迭代两个列表,因此它将在第一次迭代中访问ab中的第一个元素(即1和{{ 1}})在第二次迭代中,它将访问两个列表中的第二个元素(22),依此类推。你也可以把它写成索引上的循环(它不像使用1那样“干净”但可能更容易理解):

zip

循环体本身应该相当简单,但如果某些部分需要更多解释,请发表评论。