python - 根据给定条件查找列表中下一项的位置
python - find position of next item in list, given criteria
我是 Python 的新手,因此非常感谢简单的解释。
我有从 csv 文件中读入的数据,我已将其处理为以下形式:
[(t1,n1,v1),(t2,n2,v2),(t3,n3,v3),...]
我想做的是,给定 v 的非零值,找到下一次 v 为零的 n 出现的位置,并确定 t 值的差异。到目前为止,这是我的代码:
d=[]
for i,x in enumerate(list):
if x[2]!=0:
for j,y in enumerate(list):
if x[1]==y[1] and j>i and y[2]==0:
d.append(y[0]-x[0])
else: d.append(0)
print d
我在 excel 中使用 MATCH 和 OFFSET 函数完成了此操作,但在此处转换为索引和枚举时我有点不知所措。
我的第一个问题是嵌套的 for 循环在找到第一个匹配项时不会停止,因此它会不断为每个匹配的 n 值附加 t 值差异。我只想找到第一个匹配项。
我的第二个问题是是否有更好的方法来执行此操作,因此嵌套的 for 循环并不总是从列表的开头开始,而是从索引 i 开始。我正在处理相当大的数据集。
编辑:我设法让它工作,虽然它很不优雅(时间和注释是列表中每个元组的第一个和第二个元素的列表):
d=[]
for i,x in enumerate(list):
if x[2]!=0:
d.append(notes[i+1:].index(x[1]))
else: d.append("NA")
dur=[]
for i,j in enumerate(d):
if j!="NA":
dur.append(times[i+j+1]-times[i])
else: dur.append(0)
如果有任何关于更清洁解决方案的想法,我将不胜感激。
首先请注意,有一个名为 list 的列表并不是很好。我不是 100% 清楚你在找什么,但我认为这可行。
d = []
for index, tup in enumerate(lst):
if tup[2] != 0:
for next in lst[index + 1:]:
if next[2] == 0 and tup[1] == next[1]:
d.append(next[0] - tup[0])
break
if len(d) - 1 != index:
d.append('NA')
else:
d.append('NA')
例如:
input: lst = [(1,3,0),(1,5,6),(1,2,4),(3,4,1),(4,2,0),(7,5,0),(8,4,0)]
output: d = ['NA', 6, 3, 5, 'NA', 'NA', 'NA']
如果您只需要时间而不需要数组排列,只需删除任何附加 'NA'.
的条件
我是 Python 的新手,因此非常感谢简单的解释。 我有从 csv 文件中读入的数据,我已将其处理为以下形式: [(t1,n1,v1),(t2,n2,v2),(t3,n3,v3),...]
我想做的是,给定 v 的非零值,找到下一次 v 为零的 n 出现的位置,并确定 t 值的差异。到目前为止,这是我的代码:
d=[]
for i,x in enumerate(list):
if x[2]!=0:
for j,y in enumerate(list):
if x[1]==y[1] and j>i and y[2]==0:
d.append(y[0]-x[0])
else: d.append(0)
print d
我在 excel 中使用 MATCH 和 OFFSET 函数完成了此操作,但在此处转换为索引和枚举时我有点不知所措。
我的第一个问题是嵌套的 for 循环在找到第一个匹配项时不会停止,因此它会不断为每个匹配的 n 值附加 t 值差异。我只想找到第一个匹配项。
我的第二个问题是是否有更好的方法来执行此操作,因此嵌套的 for 循环并不总是从列表的开头开始,而是从索引 i 开始。我正在处理相当大的数据集。
编辑:我设法让它工作,虽然它很不优雅(时间和注释是列表中每个元组的第一个和第二个元素的列表):
d=[]
for i,x in enumerate(list):
if x[2]!=0:
d.append(notes[i+1:].index(x[1]))
else: d.append("NA")
dur=[]
for i,j in enumerate(d):
if j!="NA":
dur.append(times[i+j+1]-times[i])
else: dur.append(0)
如果有任何关于更清洁解决方案的想法,我将不胜感激。
首先请注意,有一个名为 list 的列表并不是很好。我不是 100% 清楚你在找什么,但我认为这可行。
d = []
for index, tup in enumerate(lst):
if tup[2] != 0:
for next in lst[index + 1:]:
if next[2] == 0 and tup[1] == next[1]:
d.append(next[0] - tup[0])
break
if len(d) - 1 != index:
d.append('NA')
else:
d.append('NA')
例如:
input:
lst = [(1,3,0),(1,5,6),(1,2,4),(3,4,1),(4,2,0),(7,5,0),(8,4,0)]
output:
d = ['NA', 6, 3, 5, 'NA', 'NA', 'NA']
如果您只需要时间而不需要数组排列,只需删除任何附加 'NA'.
的条件