枚举(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大量运用在项目里,我目前还没用过^^~~~~

如果有什么惊人的效果求分享~~~

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