如何遍历python字典中的下一个值并附加键?



我有一个python有序的字典,如下所示;我想创建一个具有相同值的新字典,并将开始和结束日期作为键。如果随机值出现在相同值的中间,那么我想忽略该随机值并继续我的字典。我正在学习python,请帮忙。 这是我排序的字典键和值:

mydict={
4/24/18 :8.75
4/25/18 :8.75
4/26/18 :8.75
4/27/18 :1
4/30/18 :8.75
5/1/18  :8.75
5/2/18  :8.75
5/3/18  :8.75
5/4/18  :3
5/7/18  :3
5/8/18  :3
5/9/18  :3
5/10/18 :3
5/11/18 :4
5/14/18 :4
5/15/18 :4
5/16/18 :1
5/17/18 :4
5/18/18 :4
5/21/18 :4
5/22/18 :4}

我想要的是:

newdict = [(8.75,(4/24/18,5/3/18)),(3,(5/4/18,5/10/18)),(4,(5/11/18,5/22/18))]

这是我尝试过的:

newdict ={}
startdate = mydict.keys()[0]
firstval = mydict.values()[0]
enddate =0
for index, (key, value) in enumerate(mydict.items()):
if value==firstval:
enddate =key
continue
else:
newdict.update({firstval: (startdate, enddate)})
startdate =key
firstval=value
#Do not use dictionary. Dictionary groups without fixed order
mylist=[('4/24/18', 8.75),
('4/25/18', 8.75),
('4/26/18', 8.75),
('4/27/18', 1.0),
('4/30/18', 8.75),
('5/1/18', 8.75),
('5/2/18', 8.75),
('5/3/18', 8.75),
('5/4/18', 3.0),
('5/7/18', 3.0),
('5/8/18', 3.0),
('5/9/18', 3.0),
('5/10/18', 3.0),
('5/11/18', 4.0),
('5/14/18', 4.0),
('5/15/18', 4.0),
('5/16/18', 1.0),
('5/17/18', 4.0),
('5/18/18', 4.0),
('5/21/18', 4.0),
('5/22/18', 4.0)]
values = [e[1] for e in mylist]
valuesreverse = values[::-1]
setvalues = set(values)
dates = [e[0] for e in mylist]
datesreverse = dates[::-1]
result = {e:(dates[values.index(e)],datesreverse[valuesreverse.index(e)]) for e in values}
print result

输出:

{8.75: ('4/24/18', '5/3/18'), 1.0: ('4/27/18', '5/16/18'), 3.0: ('5/4/18', '5/10/18'), 4.0: ('5/11/18', '5/22/18')}

在这里,我创建了带有字符串的字典,因此我使用strptime()将它们转换为 datetime 对象,然后按第二个值对该列表进行排序,然后将日期作为辅助排序。从那里使用groupby按第二个值对列表进行分组。从这里我创建了ranges,它是从我们在浏览组时附加的每个开始和结束日期创建的元组列表。 如果任何组列表中的任何日期在此范围内,我们不会将其附加到新列表中。在我们将日期时间对象转换回字符串后,然后使用字典生成器创建字典。

from datetime import datetime
from itertools import groupby
from operator import itemgetter
mydict = {
'4/24/18': 8.75,
'4/25/18': 8.75,
'4/26/18': 8.75,
'4/27/18': 1,
'4/30/18': 8.75,
'5/1/18': 8.75,
'5/2/18': 8.75,
'5/3/18': 8.75,
'5/4/18': 3,
'5/7/18': 3,
'5/8/18': 3,
'5/9/18': 3,
'5/10/18': 3,
'5/11/18': 4,
'5/14/18': 4,
'5/15/18': 4,
'5/16/18': 1,
'5/17/18': 4,
'5/18/18': 4,
'5/21/18': 4,
'5/22/18': 4
}
mydict = {datetime.strptime(k, '%m/%d/%y'): v for k, v in mydict.items()}
lst = sorted(mydict.items(), key=itemgetter(1, 0), reverse=True)
new = []
for k, g in groupby(lst, key=itemgetter(1)):
ranges = [(i[1][0], i[1][1]) for i in new]
x = list(g)
for i in ranges:
if any(date[0] >= i[0] and date[0] <= i[1] for date in x):
break
else:
new.append((k, (x[-1][0],x[0][0])))
conv = '%m/%d/%y'
new = [(i[0], f'{i[-1][0].strftime(conv)},{i[-1][1].strftime(conv)}') for i in new]
new_dict = dict(sorted(new, key=itemgetter(1)))
print(new_dict)
# {8.75: '04/24/18,05/03/18', 3: '05/04/18,05/10/18', 4: '05/11/18,05/22/18'}

最新更新