gpt4 book ai didi

python - 在python中将两个int数组相乘

转载 作者:太空狗 更新时间:2023-10-30 00:47:07 24 4
gpt4 key购买 nike

我正在尝试检索将两个 int 数组相乘的答案(输出也是一个 int 数组)。

例如,num1 = [2, 2, 0], num2 = [1, 0] 将为我们提供 [2, 2, 0, 0]>/p>

我试过的是

def multiply(num1, num2):
if num1 == [0] or num2 == [0]:
return [0]
sign = -1 if (num1[0] < 0) ^ (num2[0] < 0) else 1
num1[0] = abs(num1[0])
num2[0] = abs(num2[0])
res = [0] * (len(num1) + len(num2) + 1) # space O(n + m)
for i in range(len(num1) - 1, -1, -1):
for j in range(len(num2) - 1, -1, -1):
res[i + j + 1] += num1[i] * num2[j]
res[i + j] += res[i + j + 1] // 10
res[i + j + 1] %= 10
res[0] *= sign

return res

尝试模仿小学的乘法。

但是,在这个问题的官方回答中,它添加了这两行以删除前导零。

res = res[next((i for i, x in enumerate(res) if x != 0), len(res)):] or [0]
return res

我很困惑它是如何工作的。它似乎只是检索值不为 0 的数组的索引,但我不明白 next 如何处理它。此外,是否有更简单的方法来完成它实际尝试做的事情?

最佳答案

解释

res = res[next((i for i, x in enumerate(res) if x != 0), len(res)):] or [0]
return res

简而言之:这给出了第一个非零值的索引并从那里切分列表。

  • 或 [0] 如果给定空输入,这将导致返回 [0]
  • res[index:] 这将返回从给定的 index 开始的所有内容
  • next(iterable, something2)iterable 获取下一个值,如果 iterable 为空,则返回 something2。这确保如果给出了 0 的列表,这将给出数组的最后一个索引
  • (i for i, x in enumerate(res) if x != 0)这是一个generator创建列表中非零值 (x) 的所有索引 (i) 的值流。不返回值 (x),仅返回索引 (i)。

生成器不会为 0 生成结果,确保 next() 可以使用的第一件事是非零的第一个索引。将该值传递回切片。

另一种解决方案

为什么不将它们转换为数字、相乘然后转换回列表呢?更快、更易读

def to_int(list_int):
# This can also be done with list comprehension and powers of 10
return int("".join(map(str, list_int)))

def to_list(integer):
return [int(x) for x in str(integer)]


num1 = [2, 2, 0]
num2 = [1, 0]

to_list(to_int(num1) * to_int(num2))

[2, 2, 0, 0]

性能

比较给定的multiply()

%timeit multiply(num1, num2)
3.87 µs ± 44.5 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

%timeit to_list(to_int(num1) * to_int(num2))
2.74 µs ± 25.4 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

关于python - 在python中将两个int数组相乘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57586164/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com