繁体   English   中英

使用理解创建空列表

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM