小問題:如何返回一個 List 中某元素的索引?

2021-02-20 Python開發者

(給Python開發者加星標,提升Python技能)

綜合整理:Python開發者

問題:假設有一個列表["年薪10萬", "年薪30萬", "年薪50萬","年薪100萬"],我想得到元素"年薪100萬"的索引(即3),要怎麼做?

可能最先想到的是對列表進行遍歷,對吧?其實有個很簡單的方式,就是使用List的index函數!

簡潔的解決方法:

["年薪10萬", "年薪30萬", "年薪50萬","年薪100萬"].index("年薪100萬")3

雖然使用index這個函數是解決問題最簡潔的方法,但是index函數,它在list的API裡面是相當「弱「的,使用的時候會碰到各種問題。所以雖然解決了問題,但是我們還是要進一步的展開和總結一下index函數。

首先,看一下index函數的完整形式 list.index(x[, start[, end]]),它的功能是返回列表中從第0號數據項開始,第一個等於x的數據項的索引,如果沒有找到x,則返回ValueError。

可選參數start和end用來指定搜索列表的特定範圍內的序列,這時返回的值是相對整個list的起點,而非相對於start參數。

其次,每次調用index函數,都會順序檢查list中的每個元素,直到找到匹配或者返回ValueError。

但是如果你的list很長,並且不知道要找的元素的大概位置,那麼這個搜索過程就會成為程序運行時間的瓶頸。這個時候,你可能需要考慮換種數據結構。

但是如果你知道匹配結果大概位置,你可以給index一點「提示「。例如下面這兩個例子,l.index(999_999,999_990,1_000_000)的執行速度是l.index(999_999)的1萬倍!!因為前一個index完成匹配只搜索了10次,而後一個index函數搜索了近1百萬次!!

import timeittimeit.timeit('l.index(999_999)', setup='l = list(range(0, 1_000_000))',number=1000)15.676082027timeit.timeit('l.index(999_999, 999_990, 1_000_000)', setup='l =list(range(0, 1_000_000))', number=1000)0.00032909400000846745

第三、index函數隻返回其第一次匹配的索引。調用index的時候,會搜索整個list直到找到一個匹配的值,並停止運行。那麼如果想要返回多個匹配的話,可以使用列表推導式或生成器表達式。

[1, 1].index(1)0[i for i, e in enumerate([1, 2, 1]) if e == 1][0, 2]g = (i for i, e in enumerate([1, 2, 1]) if e == 1)next(g)0next(g)2

最後,如果要匹配的元素沒有在list種,則調用index會導致ValueError

Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: 2 is not in list

因此如果要找的元素可能不在list中,應該使用try/except捕捉ValueError異常。

def find_element_in_list(element, list_element):    try:        index_element = list_element.index(element)        return index_element    except ValueError:        return 'not exists'

Tips:最後的最後,附送一個學習Python非常有用的tip:使用help函數!

help(["年薪10萬", "年薪30萬", "年薪50萬","年薪100萬"])

得到關於list類的所有方法及說明,當然也包括index函數

class list(object)
...| index(...)
| L.index(value, [start, [stop]]) -> integer
| Raises ValueError if the value is not present.
|
| insert(...)
| L.insert(index, object)
|
| pop(...)
| L.pop([index]) -> item
| Raises IndexError if list is empty or index is out of range....

- EOF -

覺得本文對你有幫助?請分享給更多人

關注「Python開發者」加星標,提升Python技能

點讚和在看就是最大的支持❤️

相關焦點

  • Excel技巧:VLOOKUP函數如何返回多列
    最近,小編幫朋友解決了一個VLOOKUP函數返回多列的問題,感覺很實用,今天分享給大家。
  • 小tip: 如何讓contenteditable元素只能輸入純文本
    然而,這種方法的問題在於:粘貼完畢到過濾結束有時間差,用戶很看到內容一閃而過的糟糕體驗;光標的位置會發生變化,不是之前focus的位置了;當年的我圖樣圖森破,所以,只有上面這種程度。實際上,控制contenteditable元素只能輸入純文本是有體驗比較好的方法的。
  • 編碼新規:blacklist/whitelist算種族歧視,都得改!
    這期間經常被提及的一個專有名詞 Black Lives Matter,這是一個起源於2013年、抗議針對黑人的暴力和歧視的國際維權運動,引用Wiki的中文詞條Black Lives Matter(縮寫:BLM),意為「黑人的命也是命」或「黑人的命很重要」,以及「黑人性命攸關」,也被稱為「黑命貴」。
  • 網友問答:如何使用Photoshop索引模式減少圖片顏色?
    如何使用Photoshop索引模式減少圖片顏色?1、找一張無版權圖片使用自己畫的圖片或者無版權的圖片,避免版權糾紛被告索賠幾萬元……視覺某國忍不起。4、Web所用格式參數設置1、設置圖片大小像素畫尺寸都比較小,因此需要縮小原圖片的尺寸,100像素左右即可。
  • 一日一技:在網頁上如何獲取滑鼠當前指向的元素
    開發爬蟲的同學肯定用過 Chrome 開發者工具自動定位頁面元素對應的 HTML 標籤的功能,如下圖所示:那麼有沒有同學思考過,這個功能,如果用 JavaScript 怎麼實現呢?顯然,隨著滑鼠的移動,滑鼠指向的頁面元素是不斷變化的,我們需要知道滑鼠當前指向了哪一個頁面元素。在 JavaScript 中,有一個函數叫做document.elementFromPoint(x, y),輸入頁面坐標,返回該坐標上的頁面元素。而坐標可以通過滑鼠的事件來獲得。
  • 見證歷史:「blacklist」等表述將逐漸從原始碼中消失!
    本周消息,谷歌決定放棄 Chrome 瀏覽器中「blacklist(黑名單)「、「whitelist(白名單)」的用法,後續使用「blocklist」和「allowlist」來替代它們。這些國家的開發者都在努力擺脫「負面」代碼術語,希望「讓這個世界變得更友好」。
  • Excel教程:Excel生成目錄索引最簡單快捷的方法
    關於excel怎麼生成目錄的問題,答案多種多樣,有人用VBA生成,有人用宏表函數等。本著去繁化簡的原則,給大家分享另外一種更加簡單的Excel添加目錄索引的方法,主要使用到了兼容性檢查來實現。操作環境:小編用的Excel版本是2013版本,因此本文演示都是基於2013版本的Excel。 看下面的截圖,Excel文件裡面一共有16張工作表,來回切換,非常不方便,因此我們可以添加目錄索引。
  • 谷歌搜索將停止索引Flash內容
    10月28日,谷歌宣布,從今年晚些時候起,谷歌搜索將不再索引Flash內容。谷歌工程經理Dong-Hwi Lee在一份聲明中稱:「在包含Flash內容的網頁中,谷歌搜索將忽略Flash內容,停止索引獨立的SWF文件。谷歌之前宣布,」Chrome瀏覽器明年將不再支持Flash。在放棄Flash這件事上,谷歌做的非常徹底。
  • RTO設計和操作中的冷凝腐蝕問題應如何解決?
    編輯 | 北極星VOCs在線公眾號(bjx-vocs)轉載請標記來源聲明 | 本號對轉載、分享、陳述、觀點保持中立,目的僅在與行業交流,版權歸原作者所有,如涉版權和智慧財產權等侵權問題,請於本號後臺聯繫,即刻刪除內容處理
  • 人在外企必須記住一個詞:blacklist
    今天,我們要學的詞是blacklist。President Barack Obama removed Laos and Cambodia from a trade blacklist," 美國總統歐巴馬將寮國和柬埔寨從美國貿易黑名單上刪除。
  • 隱瞞病情由美返京黎某被解僱:未告知行程,因個人原因返回
    在以涉嫌妨害傳染病防治罪被立案偵查後,3月20日上午,黎女士原公司渤健生物發布聲明,黎女士原系渤健美國公司僱員,在未告知公司並忽視健康專業人士建議的情況下,因個人原因返回中國3月13日,北京市報告1例從美國輸入的確診病例,黎某,女,37歲,長期定居美國麻薩諸塞州。3月14日、15日,北京市疾控中心和中國國際航空公司在北京市新冠肺炎疫情防控工作新聞發布會上通報,黎某在美期間已出現發熱、咳嗽等症狀,並多次在當地就診,在美國登機前曾服用退燒藥,登機後未如實向乘務人員提供個人健康狀況及丈夫、兒子等同行人員情況,給同機人員造成傳染風險。
  • 子元素 scroll 父元素容器不跟隨滾動 JS 實現
    在網頁中,滾動條的滾動行為也是類似的調調,如果頁面出現多個內嵌滾動條,則行為表現是:子元素滾,子元素滾,子元素滾完父元素滾;父元素滾,父元素滾,父元素滾完容器滾……比方說下面:在妹子臉上滾,先是妹子滾,妹子滾完主頁面滾,對吧~//zxx: 別問為什麼不使用張含韻,因為張妹子照片是橫的,滾動空間小,曉得伐~這是瀏覽器的默認行為
  • 因涉種族歧視,「黑名單 blacklist」 和 「白名單 whitelist」 這兩個詞被禁用了……
    這不,我們常用的「谷歌瀏覽器Google Chrome」團隊,也開始採取行動,著手消除其原始碼中有「種族歧視」傾向的詞語。首當其衝的便是blacklist和whitelist這兩個詞。Chrome的開發團隊說:「blacklist和whitelist會加重人們對於「黑是不好的,而白是好的」這樣的具有種族歧視之嫌的認知,我們建議將這兩個詞更換為Blocklist和Allowlist」Blocklist:屏蔽名單Allowlist:允許名單據媒體報導,這種原始碼的修改,意味著有超過2000多個「黑名單」用語將會被替換掉。
  • Excel教程:為什麼我的VLOOKUP查找就返回錯誤值?
    有一網友詢問,為什麼我的VLOOKUP查找,返回的是錯誤值,而不是要查找的結果。粗看一下這位網友的截圖,貌似函數公式也沒什麼問題,VLOOKUP函數,四個參數,查找值,查找區域,返回列數,精準查找。但如果你仔細看,你就會發現一個原則性的錯誤問題,對於VLOOKUP函數的運用,有一個原則,查找區域,必須從查找值列開始,簡單點說,就是查找值列,必須在查找範圍的第一列,而我們看上圖中的問題,根據用戶暱稱,查找返回對應的訂單編號,他的查找區域的第一列數據不是用戶暱稱,而是訂單編號,所以最終只能得到錯誤的結果。
  • 命令與徵服:一個合格Windows用戶都應該知道的10個基礎CMD命令
    如果你還不知道如何訪問Windows命令提示符界面,那麼請按快捷鍵WIN+R,輸入cmd,然後回車。雖然微軟已經慢慢地在Windows系統中將CMD命令行扔到到了一邊,讓你愛用不用了。這也不無道理,這項功能中的絕大多數命令在目前看來都是不必要。但是許多命令仍然有用,甚至在Windows 8和10中添加了新的CMD命令功能。
  • 箭頭符號:一個最常見卻不容忽視的圖標
    那麼頁面中的「返回」按鈕、「下一步」按鈕在產品的交互路徑上起到路標式的作用,而這兩個按鈕通常都有箭頭圖標輔助或代替。如果把一個個頁面理解為交互路徑上到達的一個個房間,那麼房間越多,用戶可能會越焦慮,在用戶進行的當前任務之外,始終有一個問題需要面對:「我怎麼回去?」