[英]Creating empty lists with comprehension
我想获得有关此代码的一些帮助:
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 并且我不是很了解,我也很抱歉我的英语能力很差。 谢谢!
最简单的方法是使用defaultdict
IMO:
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'}
所以你需要一个嵌套理解,内部列表理解为每个键构建值列表:
>>> {v: [k for k, val in flights.items() if v == val] for v in flights.values()}
{'FREEPORT': ['09:35', '17:00'], 'WEST END': ['09:55', '19:00'], 'TREASURE CAY': ['10:45', '12:00'], 'ROCK SOUND': ['11:45', '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']}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.