python - 从主字典创建子字典
问题描述
我有一个包含时间范围字符串的字典,例如:
{'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:00
和13: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
谢谢!
解决方案
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)))
推荐阅读
- python - 如何避免将相同的str分配给字典中的列表
- c++ - 如何在不使用分配的情况下访问类中的私有变量?
- c++ - 如何将百分比转换为 C/C++ 中正态分布的 z 分数?
- python - Django:使用复选框执行多个命令
- mysql - 提取一对多关系。从第一个表中提取所有数据,包括第二个表中的所有数据
- android - 即使应用程序未运行,Ionic 3 也会将移动应用程序与网络服务器数据同步
- google-analytics - UTM 参数显示为不同的页面
- javascript - 如何使用插件在 Charts.js 中旋转数据标签?
- python - 在 matplotlib 绘图中移动原点
- c# - .NET 框架安全协议