如何解决使用理解创建空列表
我想获得有关此代码的一些帮助:
from datetime import datetime
flights = {
'09:35' : 'FREEPORT','09:55' : 'WEST END','10:45' : 'TREASURE CAY','11:45' : 'ROCK SOUND','12:00' : 'TREASURE CAY','17:00' : 'FREEPORT','17:55' : 'ROCK SOUND','19:00' : 'WEST END' }
def convert_to_ampm(time24: str) -> str:
return datetime.strptime(time24,'%H:%M').strftime('%I:%M %p')
flights_copy = {}
for k,v in flights.items():
if v not in flights_copy:
flights_copy[v] = []
flights_copy[v].append(k)
for k,v in flights_copy.items():
time = []
for item in v:
time.append(convert_to_ampm((item)))
print(k.title(),':',time)
有没有办法让这段代码写成可理解的:
for k,v in flights.items():
if v not in flights_copy:
flights_copy[v] = []
flights_copy[v].append(k)
我目前正在学习 Python,我的知识不是很丰富,我也很抱歉我的英语水平很差。谢谢!
解决方法
最简单的方法是使用 ID New_ID
250 1
250 1
340 2
340 2
340 2
650 3
650 3
650 3
IMO:
defaultdict
用推导式来做是可能的,但更难——直接推导式将覆盖值而不是附加它们:
from collections import defaultdict
flights_copy = defaultdict(list)
for k,v in flights.items():
flights_copy[v].append(k)
所以你需要一个嵌套的推导式,用一个内部列表推导式来构建每个键的值列表:
>>> {v: k for k,v in flights.items()}
{'FREEPORT': '17:00','WEST END': '19:00','TREASURE CAY': '12:00','ROCK SOUND': '17:55'}
请注意,这效率较低,因为现在您要多次循环原始字典(从 O(n) 到 O(n^2))。
,作为一个单一的理解,你至少可以这样做:
from itertools import groupby
from operator import itemgetter
flights_copy = {
v: [i[0] for i in d]
for v,d in groupby(sorted(flights.items(),key=itemgetter(1)),itemgetter(1))
}
所以如果航班是:{1: 20,2: 20,3: 10,4: 15}
那么上面的代码产生:{10: [3],15: [4],20: [1,2]}
但是,您的初始代码可读且运行良好。您可以通过以下方式对其进行改进:
from collections import defaultdict
flights_copy = defaultdict(list)
for k,v in flights.items():
flights_copy[v].append(k)
,
不是使用字典理解,而是使用 defaultdict
,我认为这很容易阅读:
>>> from collections import defaultdict
>>> flights_copy_2 = defaultdict(list)
>>> for flight_time,flight_dest in flights.items():
... flights_copy_2[flight_dest].append(flight_time)
...
>>> print(dict(flights_copy_2))
{'FREEPORT': ['09:35','17:00'],'WEST END': ['09:55','19:00'],'TREASURE CAY': ['10:45','12:00'],'ROCK SOUND': ['11:45','17:55']}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。