我需要对列表的元素求和,包含全部为0或1,如果列表中有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()参数必须是字符串或数字,而不是'list'
我刚刚开始使用python,并且无法弄清楚出现了什么问题(我用c ++编写的版本也不起作用)。
有没有人有任何指针?
另外,我如何进行求和,使其成为二进制xor,而不仅仅是十进制加法?
答案 0 :(得分:4)
你实际上并不想要总和;您想知道upper
或lower
是否包含1
值。只需利用Python的基本容器类型语法:
if 1 in upper:
# etc
if 1 in lower:
# etc
顺便说一下,您收到错误的原因是,当您尝试拆分upper
时,您正在使用额外的嵌套列表包裹lower
和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
答案 1 :(得分:3)
我需要对列表的元素求和,包含全部为0或1,如果列表中有1,则结果为1,否则为0。
有什么问题
int(1 in l)
答案 2 :(得分:2)
停止制作嵌套列表。
upper = l[mid:high]
lower = l[0:mid-1]
答案 3 :(得分:2)
我需要对列表的元素求和,包含全部为0或1,如果列表中有1,则结果为1,否则为0。
无需总结整个清单;您可以在第一个停止。只需使用any()
。如果容器中至少有一个truthy值,它将返回True
,否则会返回False
,并且它会短路(即如果在列表的早期找到真值,则不会扫描其余的部分)。方便的是,1是真实的,0不是。
True
和False
在算术上下文中作为1和0工作(布尔值是整数的子类),但是如果你想要特定的1和0,只需将any()
包裹在{ {1}}。