Python返回列表列表以查看值是否存在

2024-06-25 23:52:24 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个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]]

(注:这只是涉及时间的更大列表的一个非常简化的版本。开始是一周的开始,结束是一周的结束,这是布尔值)

到目前为止,我得到的是它遍历列表,如果start为False,它计算当前#0值和前一行#0值之间的差值,并以diff, D格式将其附加到当前行。你知道吗

如果start为true,则返回前一行的End值,如果为true,则计算当前行的#0和前一行的#0之间的差值,并以diff, W格式附加到当前行。如果前一个结尾为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是否为true,如果为true,它会计算该行的列0和当前行的列0之间的差值。如果该结束为假,假日为真,它将转到该结束之前的行并检查该结束,依此类推。你知道吗

我被困在这里的逻辑,我不知道去哪里,如何做到这一点,希望这是有意义的。如果有人能给我指出正确的方向,我会非常感激的!你知道吗

我的预期结果:

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']]

Tags: falsetrue列表indexifdiffstartend
1条回答
网友
1楼 · 发布于 2024-06-25 23:52:24

对于这样的问题,我建议您使用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

一种简化方法是使用^{},它允许您根据条件的结果选择值。以下操作应根据需要执行:

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

相关问题 更多 >