有人可以帮助我在嵌套列表中获取项目的索引,其中使用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",请在索引价格列表中查看每个价格的价格清单。 ,但似乎我错了!
请有人指出我的方式错误并帮助我吗?谢谢你的帮助!
答案 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