簡體   English   中英

(二進制)匯總列表的元素

[英](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 ++編寫的版本也不起作用)。

有人有指針嗎?

另外,我將如何做總和,使其成為二進制異或,而不僅僅是十進制加法?

您實際上並不想要一筆款項; 您想知道upperlower包含1值。 只需利用Python的基本容器類型語法即可:

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

順便說一句,您收到錯誤的原因是,當您嘗試拆分l時,您在upperlower包裹了一個額外的嵌套列表(順便說一下,請重命名此變量!)。 您只想像這樣拆分它:

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不是真實的。

在算術上下文中, TrueFalse為1和0(布爾是整數的子類),但是如果要具體指定1和0,只需將any()包裝在int()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM