Python - 从满足条件的嵌套列表中获取索引

问题描述:

请有人可以帮助我获取嵌套列表中的项目索引,其中使用Python 2.7满足特定条件?我知道在StackOverflow上有类似的问题,但我似乎无法找到处理“嵌套”列表的好例子。Python - 从满足条件的嵌套列表中获取索引

我有数据的列表,这是长行数十万,在下面的格式:

data =[ 
["","","","28.04.2015 09:34:38",1.52411,1.52428,17], 
["","","","28.04.2015 09:34:40",1.52415,1.52433,18], 
["","","","28.04.2015 09:34:42",1.52425,1.52444,19], 
["","","","28.04.2015 09:34:44",1.52417,1.52435,18], 
["","","","28.04.2015 09:34:46",1.52421,1.52440,19], 
["","","","28.04.2015 09:34:48",1.52426,1.52446,20], 
["","","","28.04.2015 09:34:50",1.52429,1.52444,15], 
["","","","28.04.2015 09:34:58",1.52423,1.52441,18], 
["","","","28.04.2015 09:35:00",1.52416,1.52434,18], 
["","","","28.04.2015 09:35:02",1.52416,1.52433,17], 
["","","","28.04.2015 09:35:04",1.52416,1.52434,18], 
["","","","28.04.2015 09:35:06",1.52406,1.52422,16], 
["","","","28.04.2015 09:35:10",1.52406,1.52421,15], 
["","","","28.04.2015 09:35:14",1.52427,1.52444,17], 
["","","","28.04.2015 09:35:16",1.52424,1.52443,19], 
["","","","28.04.2015 09:35:18",1.52434,1.52453,19], 
["","","","28.04.2015 09:35:20",1.52434,1.52451,17], 
["","","","28.04.2015 09:35:22",1.52438,1.52456,18], 
["","","","28.04.2015 09:35:24",1.52432,1.52451,19], 
["","","","28.04.2015 09:35:28",1.52445,1.52464,19], 
["","","","28.04.2015 09:35:34",1.52435,1.52451,16], 
["","","","28.04.2015 09:35:36",1.52432,1.52449,17], 
["","","","28.04.2015 09:35:38",1.52429,1.52448,19]] 

对于每一行我想要的数据“5列”比较(第一关口十进制数字)设置为某个值(以1.52440为例),并返回数据大于我的特定值的第一行的索引。

我已经做了这种使用for-row-in-data类型循环的'传统'方式的代码,但是我希望尽可能使用更好(更快)的方法,而且似乎无法产生预期的结果。

,我已经取得迄今已是相当差的尝试:

pricedata = [n[4] for n in data] 
myindex = (x for x in enumerate(pricedata) if x > 1.5440).next() 

第一行中提取价格数据山坳作为一个新的列表。我不确定这是否真的有必要,但是由于我对列表解析的理解很差,我试图将事情分解成我理解的步骤。

我真的不明白第二行正在做什么,但它似乎返回(0,1.52411) - 列表中的第一项 - 无论我输入什么比较值。

我也曾尝试:

myindex = [x for x in enumerate(pricedata) if x > 1.5440][0] 

,它似乎产生相同的结果。

我认为理解是说:

“让价的列表供您在列表的索引,价格看,如果价格任您正在看的,比大于每个价格1.5440“,但似乎我错了!

请有人指出我的方式的错误,并帮助我吗?感谢您的帮助!

+0

列表似乎并没有进行排序 – depperm

问题是,你要比较一个元组的浮动,因为索引和项目的收益enumerate元组,然而,元组被认为更大比花车在Python 2:

>>>() > 4. 
True 

因此,由enumerate生成的第一个元组总是产生一个匹配。


为了解决这个问题,你应该改为解压元组第一,并且使用next从你的产生表达返回第一个匹配指数:

next(i for i, x in enumerate(data) if x[4] > 1.52415) 
+0

也许可以通过将默认值传递给next来管理“不匹配的行”情况。 –

+0

@Jérôme取决于。如果他们想通过传递默认值,他们可以消除错误,但是,有时需要错误。 –

+0

你说得对。但是,接下来介绍时可能会提及StopIteration。但我同意使用默认值不必是自动的。 –

这可以通过分割成enumrator索引和值来实现:当在列表中没有项谓词匹配被执行

try: 
    first_index = (index for index, data in enumerate(data) 
        if data[4] > 1.52415).next() 
except StopIteration: 
    first_index = -1 

StopIteration部。

+0

使用next((发电机),无),您将提供下一个默认值,您不必捕获StopIteration。 –

+0

我的意思是下一个((发生器),-1)在你的情况。 –

你滥用enumerate。它迭代你提供的序列/迭代器,并产生索引/值对。

试试这个:

myindex = next(index for index, row in enumerate(data) if row[5] > 1.52440) 

(i for i, row in enumerate(data) if row[4] > 1.52440) 

部分是发电机,它产生满足条件的行的索引。

next遍历此生成器,直到返回第一行。

因为他使用的是生成器而不是中介列表,所以不必通过整个列表。在找到与条件匹配的第一行后,搜索停止。当表格中有许多行时,这很重要。

请注意,如果找不到匹配的行,您将得到一个StopIteration异常。如果你想在这种情况下(如None)特定的值,你可以将它作为第二个参数next

myindex = next((index for index, row in enumerate(data) if row[5] > 1.52440), None) 

data=[[0,0,0,0,0,0],[1,0,0,0,0,0],[0,0,0,0,0,0],[1,0,0,0,0,0],[0,0,0,0,0,0],[1,0,0,0,0,0],[0,0,0,0,0,0]] 
for index, value in enumerate(data): 
    if value[0] > 0: 
     print(index) 
     break 
+0

在找到第一个好行之后,您至少可以休息一下。 –

+0

是的,我忘了op只问第一场比赛。谢谢 –

+0

虽然这段代码可能会回答这个问题,但提供关于为什么和/或代码如何回答这个问题的附加上下文会提高它的长期价值。 –