[英](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.