Python中用tuple作為key

2021-10-22 20:32:24 字數 2722 閱讀 9672

其實當我得到這個結論的時候,我覺得很簡單很正常,但是我第一次看到這個用法時,我覺得很新奇:

class

solution

(object):

deflenlongestfibsubseq

(self, a)

: index =

longest = collections.defaultdict(

lambda:2

) ans =

0for k, z in

enumerate

(a):

for j in

xrange

(k):

i = index.get(z - a[j]

,none

)if i is

notnone

and i < j:

cand = longest[j, k]

= longest[i, j]+1

ans =

max(ans, cand)

return ans if ans >=

3else

0

注意倒數低三行**中的 longest[j, k] ,居然可以這樣用?一開始我以為是 defaultdict 提供的功能,因此我去翻了一下 collections 的實現,在_collectionsmodule.c裡,但是沒有找到諸如__getitem__的方法,但是我看到 defaultdict 的定義如下:

typedef struct  defdictobject;
當 dict 裡沒有key時,就會去呼叫default_factory拿到預設的key,這麼說來, dict 也支援這種用法?我試試:

'''

'''>>

> a =

>>

> a[1,

2]=3

>>

> a[1,

2]3>>

> a

還真的是。看到這裡,我大概知道為啥了,因為 1, 2 其實是乙個tuple,tuple是不可變物件,是hashable的,來驗證一下。但是我沒有 找到__getitem__的實現,不過我找到了key in dict這個操作的實現:

/

* return 1

if `key` is

indict `op`,0if

not,

and-

1 on error.*/

intpydict_contains(pyobject *op, pyobject *key)

ix =

(mp-

>ma_keys-

>dk_lookup)

(mp, key,

hash

,&value);if

(ix == dkix_error)

return-1

;return

(ix != dkix_empty &

& value != null);}

/* internal version of pydict_contains used when the hash value is already known *

/int

_pydict_contains(pyobject *op, pyobject *key, py_hash_t hash

)

可以看出來,只要hash = pyobject_hash(key);這一步是成功的,就可以。也就是說,只要能算出hash值即可,那麼我們可以來試試 把乙個class,重寫__hash__方法,來看看是否可以做key:

'''

'''classa(

list):

pass

a = a(

)d =

d[a]

=1

原本這樣是會報錯的:

$ python test.py 

traceback (most recent call last)

: file "test.py"

, line 8,in

d[a]=1

typeerror: unhashable type

:'a'

因為list並不是immutable的,所以沒法計算hash值,但是我們可以給他加上方法:

classa(

list):

def__hash__

(self)

:return

1a = a(

)d =

d[a]

=1

這樣就可以了。

好了,到這裡終於弄明白為啥可以這樣做了。那麼dict[1, 2, 3]這種寫法的好處是啥呢?那就是,原本如果我們遇到了二位矩陣、 三維矩陣時,我們得弄乙個矩陣:[[1, 2, 3], [4, 5, 6]]然後訪問其中的資料時,就這樣訪問:a[1][2],但是有了這個特性 之後,我們可以像最開始的**那樣,結合 defaultdict ,然後a[1, 2]來訪問和賦值,感覺方便了不少。

python中用列表作為佇列

佇列有 先進先出 的,這樣沒刪除或者是鄭加乙個元素,這樣就需要對原列表進行移動,這樣效率會比較低,就引入 collections.deque這樣可以提高效率 from collections import deque queue deque eric john michael print queue...

Python基礎 tuple元組

前面看過了list列表的特性以及通用操作和常用操作,今天我們來看一下不可變序列中的tuple元組,與list列表最大的不同在於,tuple元組不支援原位改變 接下來我們通過一段 來測試一下tuple元組的特性以及通用操作 異質 乙個tuple元組中可以包含不同型別的物件 數值型 字元型 元組 列表 ...

Python 元組 tuple 方法

python 元組 tuple 方法用於將可迭代物件 字串 列表 元祖 字典 轉換為元組。tuple 方法語法 tuple iterable 返回元組。以下例項展示了 tuple 方法的使用方法 tuple 1,2,3,4 1,2,3,4 tuple 針對字典 會返回字典的key組成的tuple 1...