我正在编写一个函数,该函数接受两个只能包含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个数字来轻松做到这一点,但是将列表作为输入会让我失望。
答案 0 :(得分:4)
您正在遍历列表a
和b
的值,然后尝试使用这些值对列表进行索引。您需要删除函数中的a[i]
和j[i]
并改用i
和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]
答案 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
来成对a
和b
的元素进行迭代,根据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])