python - FIFO OrderedDict的问题
PHP中文网
PHP中文网 2017-04-17 17:34:30
0
1
462
from collections import OrderedDict
import unittest

class LastUpdatedOrderedDict(OrderedDict):

    def __init__(self, capacity):
        super(LastUpdatedOrderedDict, self).__init__()
        self._capacity = capacity

    def __setitem__(self, key, value):
        containsKey = 1 if key in self else 0
        # print(self)
        if len(self) - containsKey >= self._capacity:
            last = self.popitem(last=False)
            print('remove:', last)
        if containsKey:
            del self[key]
            print('set:', (key, value))
        else:
            print('add:', (key, value))
        OrderedDict.__setitem__(self, key, value)

问题:

del self[key]  有什么特殊用意么,如果key存在的话,直接让它执行OrderedDict.__setitem__()就行了吧,没必要del再重新self[key] = value吧

ps:这是在别人的代码里看到的,欢迎大家指教。

PHP中文网
PHP中文网

认证高级PHP讲师

membalas semua(1)
刘奇

Lihat nama kelas Fungsi kelas ini adalah untuk memastikan pasangan nilai kunci yang ditulis pada panggilan terakhir adalah di penghujung. pasangan nilai kunci berada di hadapan.

a = LastUpdatedOrderedDict(256)
a[3] = 4  
a[5] = 6
print a # 按照键值对的插入顺序,打印的是LastUpdatedOrderedDict([(3, 4), (5, 6)])
a[3] = 2
print a # 这个时候,又更新了下,以3为key的键值对应该放在后面,打印的是LastUpdatedOrderedDict([(5, 6), (3, 2)])

a ialah objek instan, dengan masing-masing 3 pasangan nilai kunci, lihat
1) 3 -> 4
2) 5 -> 6
3) 3 -> 2
Kunci 1) dan 3) adalah sama, tetapi nilainya berbeza Kelas bermaksud siapa yang menulis data kemudian ( [(3, 4), (5, 6)])
Apabila melakukan langkah 3, kerana kamus anda ialah kamus tersusun dan pasangan nilai kunci yang akan disisipkan kemudian adalah di belakang, hasil yang dijangkakan ialah LastUpdatedOrderedDict([(5, 6), (3 , 2)]).
Jika anda tidak memasukkan kunci di sini, hanya tatasusunan asal akan dikemas kini semasa __setitem__, dan hasilnya akan menjadi
LastUpdatedOrderedDict([(3, 2), (5, 6)])
Jadi anda perlu Del padamkan kunci, ganggu struktur sebelumnya, dan kemudian masukkan pasangan nilai kunci.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan