枚舉(enumerate)追蹤處理元素的索引

寫這篇文章的初衷,主要是爲了讓自己記住一個“慚愧的時刻”,下面我會提到(吐舌頭~~~)
這個知識點源自於一道題,題目大概的意思是,給定一個整數數組,返回兩個數字的索引,使它們加起來等於一個特定的目標值。並且相同的元素不能使用兩次。

先說一下大致思路:

先sorted排序,這裏是從小到大排的;
接着用循環遍歷新列表,從第一個元素開始分別用目標值減;
然後用減得的數值和剩下的元素比較,若相等便返回兩個元素下標。

最初的代碼

import time
target = 12
ListA = [7,13,3,5]
StartTime = time.time()
# 排序
SortList = sorted(ListA) 
# 從第一個元素開始用目標值減
# 查找剩下元素是否有等的
for i in SortList:
    num = target - i
    SortList.remove(i)
    for j in SortList:
        if j == num:
            indexA = ListA.index(j)
            indexB = ListA.index(i)
            Index = [indexA,indexB]
            EndTime = time.time()
            print EndTime - StartTime 

運行結果: [3, 0]
運行時間: 3.73000001907

改進後

還是先說思路:

定義一個空字典;
接着用枚舉來遍歷列表元素的值和下標,並用目標值減遍歷得到的元素值;
然後把減得的差值添加到空字典中,並進行比較,比較有相同值返回對應的下標即可。

其實前後主體思路都差不多,只是形式由列表變爲字典,並引用的枚舉方法。
改進代碼

class Function:
    def Sum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        Dict = {}    # <type 'dict'>
        for index, value in enumerate(nums):
            n = target - value
            if n not in Dict:
                h[value] = index    # 不是賦值是字典添加
            else:
                return [Dict[n], i]

ListA = [7, 12, 3, 6]
import time
StartTime = time.time()
Function().Sum(ListA, 10)
EndTime = time.time()
print EndTime - StartTime  

這裏我要特別說一個地方,就是if判斷下面的 h[num] = i 這一行,注意,這裏是字典的添加,不是賦值噢~
我剛開始的時候有點被帶跑偏,好久沒轉過彎,慚愧慚愧~~~(慚愧的時刻”吐舌頭~~~)
運行結果: [0, 2]
運行時間: 0.00699996948242

這道題來看,enumerate方法好像是比純代碼效率高,但是據我有限的經驗,我沒在項目中見過enumerate的使用~~~~

哈哈,不過有興趣的朋友可以試試,用 enumerate大量運用在項目裏,我目前還沒用過^^~~~~

如果有什麼驚人的效果求分享~~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章