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

时间:2018-10-12 16:01:27

标签: python python-2.7

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

2 个答案:

答案 0 :(得分:1)

#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')}

答案 1 :(得分:1)

在这里,我创建了带有字符串的字典,因此我使用strptime()将它们转换为日期时间对象,然后按第二个值对该列表进行排序,然后按第二个日期对日期进行排序。从那里使用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'}