簡體   English   中英

pythonic方式將列表元素與其索引相關聯

[英]pythonic way to associate list elements with their indices

我有一個值列表,我想把它們放在一個字典中,將每個值映射到它的索引。

我可以這樣做:

>>> t = (5,6,7)
>>> d = dict(zip(t, range(len(t))))
>>> d
{5: 0, 6: 1, 7: 2}

這不錯,但我正在尋找更優雅的東西。

我遇到過以下內容,但它與我需要的相反:

>>> d = dict(enumerate(t))
>>> d
{0: 5, 1: 6, 2: 7}

請分享您的解決方案,
謝謝

編輯 :Python 2.6.4

對於包含1000個元素的列表,dict(zip)版本是最快的,生成器和列表推導版本幾乎完全相同,它們慢約1.5倍,功能映射(反向)相當慢。

$ python -mtimeit -s“t = range(int(1e3))”“d = dict(zip(t,range(len(t))))”
1000循環,每循環最佳3:277 usec

$ python -mtimeit -s“t = range(int(1e3))”“d = dict([(y,x)代表x,y代表枚舉(t)])”
1000循環,每循環最佳3:426 usec

$ python -mtimeit -s“t = range(int(1e3))”“d = dict(x,(y,x),枚舉(t)中的y)”
1000循環,最佳3:437每循環usec

$ python -mtimeit -s“t = range(int(1e3))”“d = dict(map(reverse,enumerate(t)))”
100個循環,最佳3:3.66毫秒/循環

我嘗試對較長的列表和較短的列表(1e2,1e4,1e5)運行相同的測試,並且每個循環的時間與列表的長度成線性比例。

有人可以時間py 2.7+版本嗎?

您可以使用列表推導(或生成器,具體取決於您的python版本)為您的第二個示例執行簡單的就地交換。


使用列表理解:

d = dict([(y,x) for x,y in enumerate(t)])

使用生成器表達式(Python 2.4及更高版本):

d = dict((y,x) for x,y in enumerate(t))

在Python2.7 +中你可以像這樣寫它

>>> t = (5,6,7)
>>> d = {x:i for i,x in enumerate(t)}
>>> print d
{5: 0, 6: 1, 7: 2}
>>> dict((x,i) for i,x in enumerate(t))
{5: 0, 6: 1, 7: 2}
>>>

您的所有元素都是唯一的(即您的列表永遠不會是5,6,7,7)嗎? 只有當您的所有元素都是唯一的時,dict解決方案才有效。

通過存儲索引,您基本上可以復制信息,因為您可以簡單地查詢列表中項目的當前索引。 復制信息通常不是最好的主意,因為它允許一組數據與另一組數據不同步。

如果正在修改列表,也沒有什么可以防止您意外地將同一索引分配給多個項目。

當您只是從列表中獲取索引時,為什么要嘗試存儲索引值?

正如大家已經寫過的那樣,在Python 2.6中我會認為以下是最pythonic:

>>> dict((x, i) for i, x in enumerate(t))
{5: 0, 6: 1, 7: 2}

不過,在功能狂熱的那一刻,我會寫道:

>>> dict(map(reversed, enumerate(t)))
{5: 0, 6: 1, 7: 2}

我最喜歡dict(zip(t,range(len(t))))。

暫無
暫無

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

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