从python中的列表列表中提取插槽

时间:2018-09-16 12:27:28

标签: python list sorting iteration

我有以下格式的列表列表,需要将其传递给api。

[
    [0, 4, 0, 4, 59], [0, 5, 0, 5, 59], [0, 6, 0, 6, 59], [0, 13, 0, 13, 59],
    [0, 14, 0, 14, 59], [0, 21, 0, 21, 59], [0, 22, 0, 22, 59], 
    [1, 5, 0, 5, 59], [1, 6, 0, 6, 59], [1, 13, 0, 13, 59], [1, 14, 0, 14, 59],
    [1, 21, 0, 21, 59], [1, 22, 0, 22, 59], [2, 5, 0, 5, 59], [2, 6, 0, 6, 59], 
    [2, 13, 0, 13, 59], [2, 14, 0, 14, 59], [2, 21, 0, 21, 59], 
    [2, 22, 0, 22, 59], [3, 5, 0, 5, 59], [3, 6, 0, 6, 59], [3, 13, 0, 13, 59],
    [3, 14, 0, 14, 59], [3, 21, 0, 21, 59], [3, 22, 0, 22, 59], 
    [4, 5, 0, 5, 59], [4, 6, 0, 6, 59], [4, 13, 0, 13, 59], [4, 14, 0, 14, 59],
    [4, 21, 0, 21, 59], [4, 22, 0, 22, 59], [5, 5, 0, 5, 59], [5, 6, 0, 6, 59],
    [5, 13, 0, 13, 59], [5, 14, 0, 14, 59], [5, 21, 0, 21, 59], 
    [5, 22, 0, 22, 59], [6, 5, 0, 5, 59], [6, 6, 0, 6, 59], [6, 13, 0, 13, 59],
    [6, 14, 0, 14, 59], [6, 21, 0, 21, 59], [6, 22, 0, 22, 59] 
]

在每个列表中,第一个元素表示日期,随后的元素表示小时和分钟至小时和分钟。在上面的示例中,对于第0天,广告位1 是04:00至6:59,广告位2是 13:00至14:59,而广告位3是 21:00至22:59。

我正在尝试将列表简化为以下内容。

[0, 04:00, 6:59, 13:00, 14:59, 21:00, 22:59]....

本质上是将每天的小时段提取并合并到一个列表中,因此从0-6天开始,最终输出将只有7个列表。

还请注意,上述格式可能会发生变化,在任何给定的一天中,可能只有1个广告位,也可能没有广告位,因此每天的广告位可能在0-3之间变化。

到目前为止,我设法按如下方式加入小时和分钟 `

 start = float(str(from_hr) + str('.')+ str(from_min))
 end =   float(str(to_hr) + str('.')+ str(to_min))`

2 个答案:

答案 0 :(得分:1)

我还假设您希望: (a)合并连续的约会(即前一个约会结束后立即开始的约会) (b)以上述方式格式化 (c)将这些按天分组在拼合的列表中。

如果是这样,您可以使用以下方法解决此问题:

(a)创建一个辅助函数,将您的日,时和分钟变量转换为分钟:

def get_minute_val(day_val,hour_val,min_val):
    return (24*60*day_val)+(60*hour_val)+min_val

(b)创建一个具有两个约会的函数,如果它们是连续的,则将它们组合为一个,如果不是连续的,则将它们不组合地返回

def combine_if_consec(first,second):
    #Check whether appointments are consecutive
    if( get_minute_val(first[0],first[3],first[4]) + 1 == 
        get_minute_val(second[0],second[1],second[2])):
        #If so, return list containing combined appointment
        return [[first[0],first[1],first[2],second[3],second[4]]]
    else:
        #Else return uncombined appointments
        return [first,second]

(c)对列表中的每个约会进行迭代调用,将其与最近添加的约会进行比较。我在处理第一次约会时有一种不太讲究的方法。

def combine_all_appointments(app_list):
    #Add first appointment to app list
    output_list = [test[0]]

    #Loop through remaining appointments
    for next_app in app_list[1:]:
        #Remove most recent appointment to output list
        prev_app = output_list.pop()

        #Add either 2 combined appointments, or one single appointment to outputlist
        output_list += combine_if_overlap(prev_app,next_app)

    return output_list

(d)使函数执行所需的格式

def format_appointments(app_list):
    return [[x[0],'%d:%02d' % (x[1],x[2]),'%d:%02d' %(x[3],x[4])] for x in app_list]

(e)和一个单独的约会按天分组,然后按天展平。

def group_by_day(app_list):
    output = {}
    #Loop through appointments
    for app in app_list:
        #Create new entry if day not yet in output dict
        if app[0] not in output:
            output[app[0]] = app[1:]
        #Add appointment values to relevant day
        else:
            output[app[0]] += app[1:]
    #Flatten dictionary
    return [[k, *output[k]] for k in output]

在您的输入上进行测试:

test = [[0, 4, 0, 4, 59],[0, 5, 0, 5, 59], [0, 6, 0, 6, 59], [0, 13, 0, 13, 59], [0, 14, 0, 14, 59], [0, 21, 0, 21, 59], [0, 22, 0, 22, 59], [1, 5, 0, 5, 59], [1, 6, 0, 6, 59], [1, 13, 0, 13, 59], [1, 14, 0, 14, 59], [1, 21, 0, 21, 59], [1, 22, 0, 22, 59], [2, 5, 0, 5, 59], [2, 6, 0, 6, 59], [2, 13, 0, 13, 59], [2, 14, 0, 14, 59], [2, 21, 0, 21, 59], [2, 22, 0, 22, 59], [3, 5, 0, 5, 59], [3, 6, 0, 6, 59], [3, 13, 0, 13, 59], [3, 14, 0, 14, 59], [3, 21, 0, 21, 59], [3, 22, 0, 22, 59], [4, 5, 0, 5, 59], [4, 6, 0, 6, 59], [4, 13, 0, 13, 59], [4, 14, 0, 14, 59], [4, 21, 0, 21, 59], [4, 22, 0, 22, 59], [5, 5, 0, 5, 59], [5, 6, 0, 6, 59], [5, 13, 0, 13, 59], [5, 14, 0, 14, 59], [5, 21, 0, 21, 59], [5, 22, 0, 22, 59], [6, 5, 0, 5, 59], [6, 6, 0, 6, 59], [6, 13, 0, 13, 59], [6, 14, 0, 14, 59], [6, 21, 0, 21, 59], [6, 22, 0, 22, 59]]

app_list = combine_all_appointments(test)
formatted = format_appointments(app_list)
grouped = group_by_day(formatted)

返回

[[0, '4:00', '6:59', '13:00', '14:59', '21:00', '22:59'], [1, '5:00', '6:59', '13:00', '14:59', '21:00', '22:59'], [2, '5:00', '6:59', '13:00', '14:59', '21:00', '22:59'], [3, '5:00', '6:59', '13:00', '14:59', '21:00', '22:59'], [4, '5:00', '6:59', '13:00', '14:59', '21:00', '22:59'], [5, '5:00', '6:59', '13:00', '14:59', '21:00', '22:59'], [6, '5:00', '6:59', '13:00', '14:59', '21:00', '22:59']]

答案 1 :(得分:0)

您可以执行以下操作:

input = [[0, 4, 0, 5, 59],[0, 5, 0, 5, 59], [0, 6, 0, 6, 59], [0, 13, 0, 13, 59], [0, 14, 0, 14, 59], [0, 21, 0, 21, 59], [0, 22, 0, 22, 59], [1, 5, 0, 5, 59], [1, 6, 0, 6, 59], [1, 13, 0, 13, 59], [1, 14, 0, 14, 59], [1, 21, 0, 21, 59], [1, 22, 0, 22, 59], [2, 5, 0, 5, 59], [2, 6, 0, 6, 59], [2, 13, 0, 13, 59], [2, 14, 0, 14, 59], [2, 21, 0, 21, 59], [2, 22, 0, 22, 59], [3, 5, 0, 5, 59], [3, 6, 0, 6, 59], [3, 13, 0, 13, 59], [3, 14, 0, 14, 59], [3, 21, 0, 21, 59], [3, 22, 0, 22, 59], [4, 5, 0, 5, 59], [4, 6, 0, 6, 59], [4, 13, 0, 13, 59], [4, 14, 0, 14, 59], [4, 21, 0, 21, 59], [4, 22, 0, 22, 59], [5, 5, 0, 5, 59], [5, 6, 0, 6, 59], [5, 13, 0, 13, 59], [5, 14, 0, 14, 59], [5, 21, 0, 21, 59], [5, 22, 0, 22, 59], [6, 5, 0, 5, 59], [6, 6, 0, 6, 59], [6, 13, 0, 13, 59], [6, 14, 0, 14, 59], [6, 21, 0, 21, 59], [6, 22, 0, 22, 59]]

output = {}
for row in input:
    key = row[0]
    output.setdefault(key, [str(key)])
    output[key].append('%d:%02d' % (row[1], row[2]))
    output[key].append('%d:%02d' % (row[3], row[4]))

result = output.values()