Python比较两个列表并将值添加到第三个列表

时间:2018-08-22 11:46:13

标签: python python-3.x

我正在编写一个函数,该函数接受两个只能包含3个元素的列表,将每个元素进行比较,然后在第三个列表中加1。示例:

in :a = [1,2,3]
    b = [3,2,1]
out: result = [1,1]

因此这里的结果是[1,1],因为b[0]>a[0], b[1] = a[1]和b [2]<a[2]

我有以下代码:

def compareTriplets(a, b):
    a = a[:3]
    b = b[:3]
    result = [0,0]
    for i,j in  list(zip(a,b)):
        if a[i] > b[j]:
            result[0] += 1
        elif a[i] < b[j]:
            result[1] += 1
    return result

但是这给了我错误“索引超出范围”。我在这里做错了什么?我至少在正确的轨道上吗?我可以通过将输入更改为6个数字来轻松做到这一点,但是将列表作为输入会让我失望。

4 个答案:

答案 0 :(得分:4)

您正在遍历列表ab的值,然后尝试使用这些值对列表进行索引。您需要删除函数中的a[i]j[i]并改用ij

def compareTriplets(a, b):
    a = a[:3]
    b = b[:3]
    result = [0,0]
    for i,j in  list(zip(a,b)):
        if i > j:
            result[0] += 1
        elif i < j:
            result[1] += 1
    return result

a = [1,2,3]
b = [3,2,1]

print (compareTriplets(a, b))
# [1, 1]

答案 1 :(得分:2)

您使用的是a[i]而不是i(与b[j]相同)。这是固定代码:

def compareTriplets(a, b):
    a = a[:3]
    b = b[:3]
    result = [0,0]
    for i,j in  list(zip(a,b)):
        if i > j:
            result[0] += 1
        elif i < j:
            result[1] += 1
    return result


a = [1,2,3]
b = [3,2,1]

print(compareTriplets(a,b))  # [1, 1]

这是一个单行样式的解决方案,它很短:

def compareTriplets(a, b):
    return [sum(r) for r in zip(*((i>j, i<j) for i,j in zip(a,b)))]

a = [1,2,3]
b = [3,2,1]

print(compareTriplets(a,b))  # [1, 1]

请注意,它也适用于包含3个以上元素的列表。

答案 2 :(得分:1)

您可以使用zip来成对ab的元素进行迭代,根据a的元素或b的元素是否更大,创建一个2元素列表,然后{{1} }结果

sum

答案 3 :(得分:0)

如果您可以将原始列表转换为numpy,那么这是最好的方法。

a = np.array([3,2,1])
b = np.array([1,2,3])

c = np.ones(np.not_equal(a, b).sum(), dtype=int)

输出

c = array([ 1, 1])