我有以下格式的列表列表,需要将其传递给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))`
答案 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()