[英](Binary) Summing the elements of a list
我需要对包含所有零或一的列表元素求和,以便如果列表中有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 ++编写的版本也不起作用)。
有人有指针吗?
另外,我将如何做总和,使其成为二进制异或,而不仅仅是十进制加法?
您实际上并不想要一笔款项; 您想知道upper
或lower
包含1
值。 只需利用Python的基本容器类型语法即可:
if 1 in upper:
# etc
if 1 in lower:
# etc
顺便说一句,您收到错误的原因是,当您尝试拆分l
时,您在upper
和lower
包裹了一个额外的嵌套列表(顺便说一下,请重命名此变量!)。 您只想像这样拆分它:
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
我需要对包含所有零或一的列表元素求和,以便如果列表中有1,则结果为1,否则为0。
怎么了
int(1 in l)
停止制作嵌套列表。
upper = l[mid:high]
lower = l[0:mid-1]
我需要对包含所有零或一的列表元素求和,以便如果列表中有1,则结果为1,否则为0。
无需对整个列表进行汇总; 您可以在第一个停止。只需使用any()
。 如果容器中至少有一个真实值,它将返回True
否则将返回False
,并且会短路(即,如果在列表的早期发现了真实值,则不扫描其余的值)。 方便地,1是真实的,0不是真实的。
在算术上下文中, True
和False
为1和0(布尔是整数的子类),但是如果要具体指定1和0,只需将any()
包装在int()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.