cari

Rumah  >  Soal Jawab  >  teks badan

python - FIFO OrderedDict的问题

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中文网2828 hari yang lalu482

membalas semua(1)saya akan balas

  • 怪我咯

    怪我咯2017-04-17 17:36:30

    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.

    balas
    0
  • Batalbalas