如何比较不同长度的数组?附Python数组符号转换实现问题
嘿,我来帮你梳理下代码里的问题,顺便解答你最后那个关于不同长度数组比较的疑问~
问题1:你的代码逻辑问题修复
先看你给出的示例:输入[6, -2, 4, -5, -7],期望输出[-2, 4, -5, 6, -7]。我们先拆解你的需求:
- 提取原数组中的负数,把它们转为正数后存到另一个数组(记为负数绝对值数组)
- 将原数组的所有元素转为正数后排序
- 把排序后的数组中,和“负数绝对值数组”里元素相同的那些值,重新转为负数
你的代码里有几个关键错误:
- 第二个循环的索引误用:你写了
for i in otricanie:,这里的i是数组里的元素(比如2、5、7),不是索引!然后你用otricanie[i]会直接报错(因为otricanie的长度只有3,i=5的时候就超出索引范围了)。正确的做法是遍历otricanie里的每个值,找到它在排序后的posled中的位置,再修改对应位置的值。 - 调用时未定义输入数组:你最后写
x = interchanged(posled),但posled变量没有提前赋值,会导致NameError。
修复后的代码如下:
def interchanged(posled): # 存储原负数的绝对值 otricanie = [] # 第一步:遍历原数组,把负数转正数,同时记录绝对值 for i in range(len(posled)): chislo = posled[i] if chislo < 0: posled[i] *= -1 otricanie.append(posled[i]) # 第二步:对原数组排序 posled.sort() # 第三步:把排序后数组中,属于原负数绝对值的元素转回负数 # 遍历每个原负数的绝对值 for val in otricanie: # 找到该值在排序后数组中的索引 if val in posled: idx = posled.index(val) posled[idx] *= -1 return posled # 测试示例输入 posled = [6, -2, 4, -5, -7] x = interchanged(posled) print(x) # 输出: [-2, 4, -5, 6, -7]
这里补充个小细节:如果原数组中有重复的负数(比如[-2, -2, 3]),list.index()只会找到第一个匹配的索引,这时候需要遍历所有索引来处理重复项,比如改成:
for val in otricanie: # 遍历所有索引,找到所有等于val的位置 for idx in range(len(posled)): if posled[idx] == val: posled[idx] *= -1 # 如果每个绝对值只对应一个原负数,处理后可以break,避免重复修改 break
问题2:如何比较不同长度的数组?
比较不同长度的数组,取决于你想实现的“比较”逻辑是什么,常见的场景有几种:
- 检查较短数组是否是较长数组的子序列:比如判断
[1,3]是否是[1,2,3,4]的子序列(元素顺序一致且连续/不连续出现),可以用双指针法实现。 - 找出两个数组的交集/并集:不管长度,找出共同元素(交集)或者所有元素(并集),可以用集合操作:
set(arr1) & set(arr2)(交集)、set(arr1) | set(arr2)(并集),但集合会去重。如果要保留重复元素,需要用计数的方式(比如collections.Counter)。 - 逐元素比较到较短数组的长度:比如前n个元素是否相等(n是较短数组的长度),可以用循环遍历到
min(len(arr1), len(arr2)),逐个对比元素。 - 统计元素出现次数的差异:比如用
Counter统计两个数组的元素计数,然后对比哪些元素的数量不同。
举个逐元素比较的简单例子:
arr1 = [1,2,3] arr2 = [1,2,3,4,5] # 比较前min(len(arr1), len(arr2))个元素是否全部相等 is_match = True for a, b in zip(arr1, arr2): if a != b: is_match = False break print(is_match) # 输出True
再比如用Counter找差异:
from collections import Counter arr1 = [2,2,3] arr2 = [2,3,3,4] counter1 = Counter(arr1) counter2 = Counter(arr2) # 找出在两个数组中计数不同的元素 diff = counter1 - counter2 print(dict(diff)) # 输出: {2:1}(arr1比arr2多一个2)
内容的提问来源于stack exchange,提问作者Anna Shevtsova
相关产品推荐
相关产品推荐

