2016-03-05 129 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)