在Python中,如何减去两个长列表中特定切片的对应元素?
假设我有以下两个列表:在Python中,如何减去两个长列表中特定切片的对应元素?,python,Python,假设我有以下两个列表: x = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] y = [None,None,None,None,None,10,20,30,40,50,60,70,80,90,100] 我需要减去每个列表的对应元素(x[I]-y[I]),我想开始从x的第6个元素中减去6,这样y中的对应元素就不为null(无)。 以下代码是我尝试过的代码,但出现错误: result = [] for i in x[5:]: result.append(x[i
x = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
y = [None,None,None,None,None,10,20,30,40,50,60,70,80,90,100]
我需要减去每个列表的对应元素(x[I]-y[I]),我想开始从x的第6个元素中减去6,这样y中的对应元素就不为null(无)。
以下代码是我尝试过的代码,但出现错误:
result = []
for i in x[5:]:
result.append(x[i] - y[i])
索引错误:列出索引超出范围您可以使用
枚举
Ex:
x = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
y = [None,None,None,None,None,10,20,30,40,50,60,70,80,90,100]
result = []
for i, v in enumerate(x[5:], 5):
result.append(v - y[i])
print(result)
[-4, -13, -22, -31, -40, -49, -58, -67, -76, -85]
输出:
x = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
y = [None,None,None,None,None,10,20,30,40,50,60,70,80,90,100]
result = []
for i, v in enumerate(x[5:], 5):
result.append(v - y[i])
print(result)
[-4, -13, -22, -31, -40, -49, -58, -67, -76, -85]
你应该这样做:
for val1, val2 in zip(x[5:], y[5:]):
result.append(val1 - val2)
for val1, val2 in zip(x, y):
if val2 is not None: # can also check if val1 is not None if needed
result.append(val1 - val2)
或
您也可以跳过None
值,如下所示:
for val1, val2 in zip(x[5:], y[5:]):
result.append(val1 - val2)
for val1, val2 in zip(x, y):
if val2 is not None: # can also check if val1 is not None if needed
result.append(val1 - val2)
获取
索引器的原因是循环中的i
被分配了x
列表的值(而不是索引!),而您正试图用这些值对列表进行索引。因此,例如,在循环的最后一步i=15
中,当该元素的索引仅为14
时,您会得到一个错误,因为您试图访问y[15]
(因为15是x[14]
的值)
但是y
只有15个元素,而且由于列表项从索引0开始,所以列表索引超出范围
一种更灵活的方法-只要两个列表长度相同,就使用zip
并跳过None
值:
x = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
y = [None,None,None,None,None,10,20,30,40,50,60,70,80,90,100]
result = []
for val_x, val_y in zip(x, y):
if(val_y is None):
continue
result.append(val_x - val_y)
print(result)
输出:
[-4, -13, -22, -31, -40, -49, -58, -67, -76, -85]
或作为列表:
result = [ (val_x - val_y) for val_x, val_y in zip(x, y) if (val_y is not None) ]
正如@meowgoesthedog在评论中所说,数组索引从0开始
此外,由于您的2个列表大小相同,您可以对其进行压缩,以使代码看起来更漂亮,因此这里有一个压缩列表的解决方案:
result=[]
对于列表中的i,j(zip(x,y))[5:]:
result.append(i-j)
这里有一个解决方案,没有:
result=[]
对于范围(x[5:]-1)内的i:
result.append(x[i]-x[j])
试试这个,它会处理两个列表中的“无”。我们不需要手动跟踪它们。如果我们不需要前5个,那么我们可以在减法上加一个切片
subtrct=[None if val is None else (val - (0 if y[index] is None else y[index])) for index, val in enumerate(x)]
您可以使用函数starmap()
和dropwhile()
:
1) 您是否打算使用x
元素作为索引?2) 请注意,Python数组索引从零开始。这些值不是x中的索引。我知道索引从0开始。如果您知道索引从0开始,那么索引器的原因应该是清楚的。而且,x中的第6个元素是7,不是6。@RahilHastu:不是,是6
。数一数,永远不要这样做。这是非常不和谐的,根本看不清楚。