Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中,如何减去两个长列表中特定切片的对应元素?_Python - Fatal编程技术网

在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
。数一数,永远不要这样做。这是非常不和谐的,根本看不清楚。