gpt4 book ai didi

python - (二进制)对列表的元素求和

转载 作者:太空宇宙 更新时间:2023-11-04 06:56:15 27 4
gpt4 key购买 nike

我需要对列表的元素求和,其中包含所有零或一,如果列表中有 1,则结果为 1,否则为 0。

def binary_search(l, low=0,high=-1):
if not l: return -1
if(high == -1): high = len(l)-1
if low == high:
if l[low] == 1: return low
else: return -1
mid = (low + high)//2
upper = [l[mid:high]]
lower = [l[0:mid-1]]
u = sum(int(x) for x in upper)
lo = sum(int(x) for x in lower)
if u == 1: return binary_search(upper, mid, high)
elif lo == 1: return binary_search(lower, low, mid-1)
return -1

l = [0 for x in range(255)]
l[123] = 1
binary_search(l)

我用来测试的代码

u = sum(int(x) for x in upper)

在解释器中工作正常,但给了我错误

TypeError: int() 参数必须是字符串或数字,而不是“列表”

我刚开始使用python,不知道哪里出了问题(我用c++写的版本也不行)。

有人指点吗?

此外,我该如何求和才能使其成为二进制异或,而不是简单的十进制加法?

最佳答案

您实际上并不想要总和;您想知道 upperlower 是否包含 1 值。只需利用 Python 的基本容器类型语法:

if 1 in upper:
# etc
if 1 in lower:
# etc

顺便说一句,你得到错误的原因是因为你在尝试时用额外的嵌套列表包装了 upper 和split l(顺便重命名这个变量!!)。你只想像这样拆分它:

upper = the_list[mid:high]
lower = the_list[:mid-1]

最后,值得注意的是你的逻辑很奇怪。这不是传统意义上的二进制搜索。看起来您正在实现“在此列表中查找第一次出现的 1 的索引”。即使忽略已经有一个内置函数来执行此操作的事实,您也可以通过遍历整个列表直到找到 1 来获得更好的服务。现在,您的时间复杂度为 O(nlogn)(加上一堆额外的一次性循环),考虑到输出可以在 O(n) 中复制,这是相当愚蠢的 时间:

def first_one(the_list):
for i in range(len(the_list)):
if the_list[i] == 1:
return i
return -1

或者当然更简单地使用内置函数 index:

def first_one(the_list):
try:
return the_list.index(1)
except ValueError:
return -1

关于python - (二进制)对列表的元素求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17408759/

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