Python - 从符合条件的嵌套列表中获取索引

时间:2017-06-14 11:56:52

标签: python list-comprehension nested-lists

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

我有一个长达数十万行的数据列表,格式如下:

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列和第34列中的数据。 (第一个十进制数字)到某个值(让我们以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()

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

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

我也尝试过:

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

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

我认为理解是在说:

"如果您所查看的价格大于1.5440",请在索引价格列表中查看每个价格的价格清单。 ,但似乎我错了!

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

4 个答案:

答案 0 :(得分:4)

问题是,您将元组与浮点数进行比较,因为enumerate返回索引和项的元组,但是,元组被认为更大而不是Python 2中的浮点数:

>>> () > 4.
True

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

要解决此问题,您应首先解包元组,然后使用next从生成器表达式返回第一个匹配的索引:

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

答案 1 :(得分:2)

您滥用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)

part是一个生成器,它产生符合条件的行索引。

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

因为他使用生成器而不是中间列表,所以您不必浏览整个列表。在找到与条件匹配的第一行后,搜索停止。当表有很多行时,这很重要,就像你的那样。

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

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

答案 2 :(得分:0)

这可以通过将枚举器拆分为索引和值来实现:

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

当列表中没有项与谓词匹配时,执行StopIteration部分。

答案 3 :(得分:0)

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