[英]Python 3: When to use dict, when list of tuples?
我有id
監獄囚犯的S,例如。 每個囚犯都有一個名字。
我知道dictionarys是如何工作的,我知道元組是如何工作的,我知道列表是如何工作的,但有時候我會看到一個字典被使用,有時候會看到一個元組列表。 在我的情況下我應該使用哪一個?
d = {
1: "Mike",
2: "Bob",
3: "Tom"
}
VS
l = [
(1, "Mike"),
(2, "Bob"),
(3, "Tom")
]
並概括了這個問題:我應該何時使用dict,何時使用元組列表,哪一個有什么好處?
在按順序存儲項目時,應使用列表。 在這種情況下,唯一重要的是ID被映射到名稱。
字典是映射,這意味着鍵和值之間的關系不對稱。 例如,通過已知值獲取密鑰是棘手的(並且在一般情況下並不總是可行),而通過任何項的值過濾元組的列表(或者一組)也是同樣容易的。
話雖這么說,在選擇數據結構時,考慮如何從中檢索數據是有意義的。 如果你可以看到id
和name
是類似於C struct
的東西的相等部分(例如,你需要通過它們中的任何一個進行搜索等),那么你最好使用元組或collections.namedtuple
。 您仍然可以將它們放在列表或集合中,具體取決於您是否需要保留它。
但是如果id
是一個“特殊”字段,用於檢索有關該對象的其余信息,並且它保證是唯一的(好吧,“ID”表示它),並且您不需要內部訂單,而您想要恆定時間隨機訪問 - 當然使用dict。
它們之間有兩個主要區別:
字典是無序的,元組列表是。 因此,如果訂購很重要,請使用后者。
將鍵映射到值在dict中占用恆定時間,在元組列表中執行相同操作需要線性時間。 因此,鍵值對的數量越大,掃描元組列表以查找匹配所需的時間就越多,而在字典中,查找幾乎是即時的。
(如果您的元組按排序順序保存,則可以使用二進制搜索將搜索時間縮短為O(log n);但這仍然比字典的常量時間慢。
在大多數情況下,您使用dict
。 即使需要訂購,您也可以使用collections.OrderedDict
來獲得兩全其美。
在你的情況下,我會使用字典。 您可能需要考慮使用一個原因。
例如,考慮一下:
要使用字典獲取囚犯的姓名,您只需執行以下操作:
d.values()
要使用元組列表執行相同的操作,您需要執行此操作:
names = []
for tup in l:
names.append(tup[1])
例如
d[1] = 'Fotis'
要使用元組列表實現相同的功能,您必須使用新元組替換要操作的元組。
例如
l[1] = (2, 'Max')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.