簡體   English   中英

Python:控制流

[英]Python: Control Flow

我現有的代碼有問題。 代碼如下:

example_dic = {'name': 'jim','value': 4}
list_of_dic = [example_dic,dic2,dic3,...]
empty_list = []    #will be filled with multiple dictionaries all in same format/same keys
key_sum = sum(blah['value'] for blah in empty_list)    #tested this with a filled in "list_of_dic", works as expected

if not empty_list or key_sum < arbitrary_value:
    for things in list_of_dic[:]:
        if case1:
            empty_list.append(things)
            list_of_dic.remove(things)
        elif case2:
            empty_list.append(things)
            list_of_dic.remove(things)
        else:
            pass

問題是即使將事情追加到empty_listkey_sum也不會更新。 正如我在評論中說的那樣,我知道key_sum行是有效的,因為我通過先填充隨機內容的字典列表來進行嘗試。

我想要的是,僅當key_sum < arbitrary ,項才會繼續添加到list_of_dic 例如,如果我想要key_sum < 20 ,如果下一項導致key_sum >= 20 ,那么我根本就不希望添加它,而不僅僅是在添加完之后就中斷並結束。 我也不希望代碼到此結束,如果有一個包含10個項目的列表,而第一個具有value = 22我不想整個事情都停下來,我希望它繼續進行其余的工作,添加項目直到它不再添加不會導致key_sum >= 20

比較簡單的答案是,是否有其他語言不需要看起來很簡單的任務就不需要這種不必要的復雜性?

這有兩個問題。 一種是您的代碼假定在您更改empty_listkey_sum會自動更新,但事實並非如此。 它只計算一次。 你需要重新計算key_sum在每個迭代上,或者如果你真的很擔心效率,增加了key_sum每次追加到時間empty_list 似乎您還想在每次for循環的迭代中檢查key_sum的值,而不是僅在遍歷整個list_of_dic

第二個問題是,您要遍歷list_of_dic刪除項目。 這在Python中具有未定義的行為,通常會導致跳過可迭代的某些元素。 相反,您需要遍歷列表的副本。

總結更改:

for things in list_of_dic[:]:  # Iterate over a copy of list_of_dic
    do_append = False
    if case1:
        do_append = True
    elif case2:
        do_append = True

    if do_append:
        if (key_sum + things['value']) >= arbitrary_value:
            continue
        empty_list.append(things)
        list_of_dic.remove(things)
        key_sum += things['value']

暫無
暫無

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

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