[英]Python go back through list of lists to see if value exists
可以说我有一个2D列表:
#0 #1 #start #end #holiday
lst=[[1,'a', False, False, False],
[3,'b', False, False, False],
[7,'c', False, True, False],
[0,'c', False, False, True],
[13,'d',True, False, False],
[21,'e',False, False, False],
[31,'f',False, False, False]]
(nb只是涉及时间的较大列表的简化版本。“开始”是星期的开始,“结束”是星期的结束,它们是布尔值)
到目前为止,我已经了解了整个列表,如果start为False,它将计算当前#0值与前一行#0值之间的差,并将其以diff, D
格式附加到当前行diff, D
如果start为true,则返回到前一行的End值,如果为true,则计算当前行的#0与前一行的#0之间的差,并以diff, W
格式追加到当前行。 如果前一个End为false,则仅追加No end defined
。 这是本节的代码:
for row in lst:
row_index = lst.index(row)
if row_index == 0:
row.append('x')
if row[2]==False: # if not start of week
valBefore = lst[row_index-1][0]
valCurrent = lst[row_index][0]
diff = valCurrent-valBefore
row.append(str(diff)+', D')
else:
if lst[row_index-1][3] == True:
valBefore = lst[row_index-1][0]
valCurrent = lst[row_index][0]
diff = valCurrent - valBefore
row.append(str(diff)+', W')
else:
row.append('No end defined')
我想做的是,如果Start为true,但是上一个End为False,Holiday为True,它将检查该End之前的那个,并查看End是否为True,如果是,它将计算该行的第0列与当前行的第0列之间的差异。 如果End为False,Holiday为True,它将转到该行之前的行并进行检查,依此类推。
我在这里坚持逻辑,我不确定去哪里以及如何做到这一点,希望这是有意义的。 如果有人能指出正确的方向,我将不胜感激!
我的预期结果:
lst=[[1,'a', False, False, False, ''],
[3,'b', False, False, False, '2, D'],
[7,'c', False, True, False, '4, D'],
[0,'c', False, False, True, 'Holiday'],
[13,'d',True, False, False, '6, W'],
[21,'e',False, False, False, '8, D'],
[31,'f',False, False, False, '10, D']]
我建议您使用pandas
解决此类问题:
import pandas as pd
df = pd.DataFrame(lst, columns=['0','1', 'start', 'end', 'hholiday'])
0 1 start end hholiday
0 1 a False False False
1 3 b False False False
2 7 c False True False
3 0 c False False True
4 13 d True False False
5 21 e False False False
6 31 f False False False
一种简化此方法的方法是使用np.where
,它使您可以根据条件的结果选择值。 以下应该做您想要的:
import numpy as np
if_true = np.where(df.end.shift().fillna(False),
df['0'] - df['0'].shift(),
'No end defined')
df['diff'] = np.where(df.start, if_true, df['0'] - df['0'].shift())
print(df)
0 1 start end hholiday diff
0 1 a False False False nan
1 3 b False False False 2.0
2 7 c False True False 4.0
3 0 c False False True -7.0
4 13 d True False False No end defined
5 21 e False False False 8.0
6 31 f False False False 10.0
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.