簡體   English   中英

RuntimeError:OrderedDict在迭代過程中發生了變異

[英]RuntimeError: OrderedDict mutated during iteration

我對python3來說相對較新,並且正在嘗試遍歷預先存在的OrderedDict()來刪除值為None條目。 在python2中,這不是問題,但據我了解,移除dict.iteritems() (等)是由於返回dict.items()的方式發生了一些變化。

再也不想避免復制字典了。

我將要做(可能成百上千)這樣的事情,而且我不想將僅用於從OrderedDict刪除空條目的內存量加倍。

這是引發錯誤的代碼:

class DefaultHeaders(OrderedDict):
    def __init__(self, loop=None):
        super(DefaultHeaders, self).__init__()

        self['User-Agent'] = "Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:16.0.1) Gecko/20121011 Firefox/16.0.1" # <--(dummy User-Agent header for consistent response-format)
        self['X-Search-ClientIP'] = gethostbyname(gethostname())                                                 
        self['X-MSEdge-ClientID'] = None
        self['Accept'] = None
        self['Accept-Language'] = None
        self['X-Search-Location'] = None

        self._clean1() # <--raises error
        # self._clean2() # <--raises error
        # self._clean3() # <--raises error

    def _clean1(self):
        for k, v in self.items():
            if k in ('count', 'offset'):
                pass
            elif not v: del self[k]

    def _clean2(self):
        for k, v in list(self.items()):
            if k in ('count', 'offset'):
                pass
            elif not v: del self[k]


    def _clean3(self):
        _iter_this = list(self.items())
        for k, v in _iter_this:
            if k in ('count', 'offset'):
                pass
            elif not v: del self[k]

這是我得到的錯誤:

...
    for k, v in self.items():
RuntimeError: OrderedDict mutated during iteration

Process finished with exit code 1

(> _ <)我感到有點傻,但這不是新的笑。 感謝所有發布答案的人。 這是我現在得到的:

def _clean(self):
    for k in list(self.keys()):
        if k in ('count', 'offset'):
            pass
        elif not self[k]:
            del self[k]

我也意識到復制不是一個選擇。 我需要重新分配self並創建類的新實例,調用_clean()產生無限遞歸。

如何用索引迭代字典?

    def _clean4(self):
        i = 0

        while i < len(self):
            if self.keys()[i] not in ('count', 'offset') and not self[self.keys()[i]]:
                del self[self.keys()[i]]
            else:
                i = i + 1

您是否嘗試過:

[ordered_dict.pop(k) for k in ordered_dict if k not in ['count', 'offset'] or ordered_dict[k] == None]

暫無
暫無

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

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