簡體   English   中英

Python list.index()與字典

[英]Python list.index() versus dictionary

我有大約50個字符串的列表。 我將反復(可能數以萬計)需要知道列表中項目的位置。 每次使用list.index()更好,還是創建一個將每個項目映射到其位置的字典? (我的直覺是創建字典,但是我不知道列表索引的基礎是什么,它可能是多余的。)

list.index()將遍歷列表,直到找到要查找的項目為止,這是線性時間操作。 相比之下,在字典中查找字符串是恆定時間操作,因此字典方法可能會具有更好的性能。

由於您的鍵是字符串,而您的鍵卻相對較少,因此您可能要探索的另一個數據結構是trie

使用字典映射,而不是在列表中查找項目。 字典映射在評估之前使用每個項目的哈希。 與通過列表進行搜索並逐項評估(線性時間縮放)相比,散列比較要快得多,並且可以在固定時間內找到更快。

您可以像這樣配置您的查找:

import timeit
setup = 'from __main__ import foo_dict, foo_list'

限制僅50個長列表的比較:

l = list(str(i) for i in range(50))
d = dict((str(i), i) for i in range(50))
def foo_dict(k):
    return d[k]

def foo_list(k):
    return l.index(k)

timeit.repeat('[foo_dict(str(i)) for i in range(50)]', setup)

給我的回報:

[20.89474606513977, 23.206938982009888, 22.23725199699402]

timeit.repeat('[foo_list(str(i)) for i in range(50)]', setup)

返回:

[47.33547496795654, 47.995683908462524, 46.79590392112732]

由於使用哈希表,因此對字符串的dict查找要快得多,而對索引的列表查找要慢得多,因為它必須根據要查找的字符串評估其中的每個字符串。

字典將更快,並且創建起來也非常快:

indexer = dict((v, i) for i, v in enumerate(thelist))

enumerate i in range(len(thelist)) (i, thelist[i])產量(i, thelist[i]) ,生成器表達式將“交換”元組(因為您需要將內容映射到索引,反之亦然)。

請注意,這僅在每個列表項都是可哈希的時才有效,但是由於您說的是字符串,因此應該沒問題。

dict除其他外,迅速將(key, value)元組的可迭代元組轉換為相應的字典。

暫無
暫無

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

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