2016-03-05 189 views
0

我有某種心理障礙或我想的東西。 我使用正則表達式從較大的列表項中提取的日期和時間的列表 -查找列表項目的索引

dates = [['2015-2016'], ['24/08/15'], ['0900-1045'], ['1045-1100'], ['1200-1300'], ['1300-1430'], ['1430-1450'], ['1450-1550'], ['31/08/15'], ['0900-1030'], ['1200-1300'], ['1300-1600'], ['07/09/15', '18/09/15'], ['21/09/15'], ['0900-1000'], ['1100-1200'], ['1200-1300'], ['1400-1530']] 

林不能確定爲什麼這創造了單個項目列表的列表,但它有,我一直在試圖找到的索引通過

dates.index("0900-1045") 

一個項目我已經嘗試了各種搜索字符串,上面的那個,「‘0900-1045’」和[「0900-1045」],但我做什麼都得到「ValueError異常:「」 0900- 1000'「不在列表中」或我使用的任何文本。 如果可能,我會嘗試搜索部分字符串,但我不知道如何。

任何建議爲什麼沒有找到?

斯特沃

+7

不知道。當我使用'dates.index([「0900-1045」])'時,它適用於我。 – zondo

+0

這很奇怪...我使用Python 2.7。你呢? – Stevo

+0

@zondo很奇怪....:D兩個字符更多 – Mai

回答

0

自己張貼的方式,你不會找到入口,因爲你有名單的列表。因此,你需要在列表中找到一個列表不是

dates = [['2015-2016'], ['24/08/15'], ['0900-1045'], ['1045-1100']] 

dates.index(['0900-1045']) 
+1

男人,不要殺人的樂趣:(這是一個來自@zondo的巧妙評論 – Mai

+0

@Mai只是注意到你的意見,天才的確如此 – Suever

+0

列表和列表清單之間的混淆是正確的,我知道我有一個列表清單,但沒有意識到我無法像正常列表一樣搜索它。 – Stevo

1

dates.index(["0900-1045"])應該工作。如果沒有,請發佈您的代碼。

要搜索部分匹配,你可以不喜歡

import re 
filter(lambda x: re.search(partial_string,x[1][0]), enumerate(dates)) 

獲得與指數匹配列表。

0

問題是你的'日期'不是一個字符串列表 - 它是一個字符串列表(所有這些列表的長度爲1)。如果您改爲 dates.index([「0900-1045」]) 索引計算正確。這可能是最好的重寫你的代碼,所以'日期'只是一個字符串列表。

0

如果你真的不能用一個列表,你正在運行的Python的任何版本的指數,你可以做

[ x[0] for x in dates ].index('24/08/15') 

或使用地圖:

map(lambda(x):x[0], dates).index('24/08/15') 

但使用列表作爲一個指數是最好的很長的路要走: enter image description here

0

我試過以下 -

Python 2.7.9 (default, Dec 10 2014, 12:28:03) [MSC v.1500 64 bit (AMD64)] on win32 
Type "copyright", "credits" or "license()" for more information. 

>>> dates = [['2015-2016'], ['24/08/15'], ['0900-1045'], ['1045-1100'], ['1200-1300'], ['1300-1430'], ['1430-1450'], ['1450-1550'], ['31/08/15'], ['0900-1030'], ['1200-1300'], ['1300-1600'], ['07/09/15', '18/09/15'], ['21/09/15'], ['0900-1000'], ['1100-1200'], ['1200-1300'], ['1400-1530']] 
>>> dates.index("0900-1045") 

Traceback (most recent call last): 
    File "<pyshell#1>", line 1, in <module> 
    dates.index("0900-1045") 
ValueError: '0900-1045' is not in list 
>>> dates.index(['0900-1045']) 
2 

至於你說你得到單個項目列表的列表,那麼你也應該尋找的日期列表內的名單應該是這樣做的指數 -

dates.index(「名單「)

0

您應該嘗試dates.index([」0900-1045「])作爲zondo的評論。這是因爲你有一個包含列表元素的列表。要獲得元素在列表中的位置,您應該將實際元素參數傳遞給index方法。 在你的情況下,元素是列表本身,所以通過列表。

0

雖然其他答案的重點是找到包含您的目標字符串的列表列表中的子列表,但這裏是一個扁平化列表列表的方法,以便您可以直接找到該字符串的索引。

考慮:

>>> dates = [['2015-2016'], ['24/08/15'], ['0900-1045'], ['1045-1100'], ['1200-1300'], ['1300-1430'], ['1430-1450'], ['1450-1550'], ['31/08/15'], ['0900-1030'], ['1200-1300'], ['1300-1600'], ['07/09/15', '18/09/15'], ['21/09/15'], ['0900-1000'], ['1100-1200'], ['1200-1300'], ['1400-1530']] 

可以將列表(每片含一個字符串)的列表扁平化到扁平列表是這樣的:

>>> dates[:]=[string for li in dates for string in li] 

現在dates是一個字符串列表:

>>> dates 
['2015-2016', '24/08/15', '0900-1045', '1045-1100', '1200-1300', '1300-1430', '1430-1450', '1450-1550', '31/08/15', '0900-1030', '1200-1300', '1300-1600', '07/09/15', '18/09/15', '21/09/15', '0900-1000', '1100-1200', '1200-1300', '1400-1530'] 

而且您的原始.index將工作:

>>> dates.index("0900-1045") 
2 
0

你可以列舉,過濾器,並採取第一場比賽:

index = next(index for (index, date) in enumerate(dates) 
      if "0900-1045" in date)