首页 > 解决方案 > 从主字典创建子字典

问题描述

我有一个包含时间范围字符串的字典,例如:

{'10:00-12:00': 'Maths',
 '13:00-15:00': 'Physics',
 '16:00-18:00': 'History',
 '19:00-22:00': 'Biology',
 '23:00-01:00': 'Chemistry',
 '02:00-04:00': 'Computer',
 '05:00-10:00': 'English'}

现在我想从字典中提取结束时间,比如12:0013:00,并用第二个主题的名称制作一个字典。

所以我想要的输出是

{'12:00-13:00':'Physics',
 '15:00-16:00':'History',
 '18:00-19:00':'Biology',
 '22:00-23:00':'Chemistry',
 '01:00-02:00':'Computer',
 '04:00-05:00':'English'}

我可以自己制作这个字典(通过硬连线值),但我希望它是动态的,因为键是数据框的列名(来自 csv),值是字段名。所以我想让python根据csv动态拾取它。我尝试过使用zip(lst,lst[1:]),但它不适用于字典,因为字典的索引不同。我也尝试过使用:

data = {'10:00-12:00': 'Maths',
        '13:00-15:00': 'Physics',
        '16:00-18:00': 'History',
        '19:00-22:00': 'Biology',
        '23:00-01:00': 'Chemistry',
        '02:00-04:00': 'Computer',
        '05:00-10:00': 'English'}

def pairwise(iterable):
    it = iter(iterable)
    a = next(it, None)

    for b in it:
        yield (a, b)
        a = b

a = pairwise(data)
print(list(a)) #[('10:00-12:00', '13:00-15:00'), ('13:00-15:00', '16:00-18:00'), ('16:00-18:00', '19:00-22:00'), ('19:00-22:00', '23:00-01:00'), ('23:00-01:00', '02:00-04:00'), ('02:00-04:00', '05:00-10:00')]
#not the keys of the desired output

谢谢!

标签: pythondictionaryiteration

解决方案


import more_itertools
from collections import namedtuple

data = {'10:00-12:00': 'Maths', '13:00-15:00': 'Physics',
        '16:00-18:00': 'History', '19:00-22:00': 'Biology', 
        '23:00-01:00': 'Chemistry', '02:00-04:00': 'Computer', 
        '05:00-10:00': 'English'}

Item = namedtuple('Item', ('start', 'end', 'subject'))
def parse(item):
    times, subject = item
    start, end = times.split('-')
    return Item(start, end, subject)

def generate_items(data):
    for item1, item2 in more_itertools.windowed(data,2):
        yield f'{item1.end}-{item2.start}', item2.subject

data = [parse(item) for item in data.items()]
print(dict(generate_items(data)))

输出

{'12:00-13:00': 'Physics', '15:00-16:00': 'History', '18:00-19:00': 'Biology', '22:00-23:00': 'Chemistry', '01:00-02:00': 'Computer', '04:00-05:00': 'English'}

more-iterools包很方便,但more_itertools.windowed()可以用类似的东西代替zip(data[:-1], data[1:])

from collections import namedtuple

data = {'10:00-12:00': 'Maths', '13:00-15:00': 'Physics',
        '16:00-18:00': 'History', '19:00-22:00': 'Biology', 
        '23:00-01:00': 'Chemistry', '02:00-04:00': 'Computer', 
        '05:00-10:00': 'English'}


Item = namedtuple('Item', ('start', 'end', 'subject'))
def parse(item):
    times, subject = item
    start, end = times.split('-')
    return Item(start, end, subject)

def generate_items(data):
    for item1, item2 in zip(data[:-1], data[1:]):
        yield f'{item1.end}-{item2.start}', item2.subject

data = [parse(item) for item in data.items()]
print(dict(generate_items(data)))

推荐阅读