2013-03-02 40 views
2

什麼是Python中最有效的雙值數據結構,支持重複和排序?Python中最有效的雙值數據結構,支持重複和排序?

我需要一個像結構的字典,但它必須支持重複,我要找的是可以進行排序快速的基於每對的第一個值的解決方案。

+0

你能澄清你的意思是「支持重複」嗎?它幾乎聽起來像你只是想要一個元組列表......(雖然在這種情況下查找效率不高)。 – 2013-03-02 21:57:49

+0

是的,這是一個愚蠢的問題。我現在使用的是元組列表,我不想執行查找,但我想知道是否有類似於字典的界面(例如:只檢索鍵或第一個值)。 – fdisk 2013-03-02 22:11:53

+0

這根本不是一個愚蠢的問題!當我第一次讀到時,我只是不清楚你問的是什麼。 – 2013-03-02 22:21:13

回答

2

使用bisect模塊保持一個有序列表。隨着名單data,對於每一個新的對(a,b)data.insertbisect(data,(a,LARGE_NUMBER))返回的索引處添加起始a所有現有條目後,一個新的條目。該列表始​​終以排序順序進行維護,因此您不必擔心「快速排序」。

>>> from bisect import bisect 
>>> from random import randint 
>>> data = [] 
>>> for x in range(20): 
... a,b = randint(1,10),randint(1,100) 
... data.insert(bisect(data,(a,1000)),(a,b)) 
... 
>>> for d in data: print (d) 
... 
(1, 67) 
(1, 85) 
(1, 38) 
(2, 78) 
(3, 57) 
(3, 37) 
(4, 76) 
(4, 74) 
(5, 47) 
(5, 24) 
(5, 59) 
(5, 91) 
(6, 85) 
(6, 41) 
(7, 18) 
(7, 41) 
(7, 24) 
(9, 48) 
(9, 77) 
(9, 82) 
(10, 80) 
+1

不錯!在附註上,排序比在任意索引處插入要快。它取決於OP的用例,但是在最後(或每批'append's)之後建立並排序,除非OP需要順序使_always_處於排序狀態。 – 2013-03-02 22:30:46

+0

謝謝! 「bisect.insort」方法符合我的需求。對於我的用戶案例,它比排序更好,因爲我必須做多個插入操作,操作必須排序的列表,進行更多插入並重新排序。 – fdisk 2013-03-02 23:58:55

+0

'bisect.insort'也會對這個對的第二個值進行排序,你指出這對這種排序並不重要。這就是爲什麼我沒有使用它。但你知道你的要求比我更好! – PaulMcG 2013-03-03 00:30:54