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

如何迭代python字典中的下一个值并附加键?,python,python-2.7,Python,Python 2.7,我有一个python排序的dict,如下所示;我想创建一个具有相同值的新dict,并将开始和结束日期作为键。如果一个随机值出现在同一个值的中间,那么我想忽略那个随机值,继续我的DII.我正在学习Python,请帮助。 这是我订购的dict键和值: 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

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

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
输出:

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

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

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

您有一本普通词典,而不是collections.OrderedDict。Python中的默认词典没有排序。你能至少给我们一个有效的Python作为你字典的定义吗?newdict={8.75:4/24/18,5/3/18,3:5/4/18,5/10/18,4:5/11/18,5/22/18}不是一个dict。换句话说,mydict.keys[0]不保证是“第一个”键,几乎可以肯定,这是一个与您期望的不同的键。@MartijnPieters:这是我字典的一小部分,因为我的数据集非常大,我在字典中根据日期对键进行了排序,因为我需要按日期排序。@a.S:您可能在源代码中对行进行了排序,但这并不意味着字典数据结构记住了顺序。事实并非如此,因为字典不是有序的数据结构,这意味着它们可以根据需要对键值对重新排序,以提高存储效率。所以您认为项目编号0实际上不是项目0。谢谢您的尝试,这并不完全正确。值1不应具有单独的日期。请查看我想要的结果。@A.S更新检查新的outputvalue 1及其相应的日期不应出现在输出中。输出应该完全忽略在同一个值中间出现的一个值。谢谢您的尝试,这不是完全正确的。值1不应具有单独的日期。请看我想要的结果。
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'}