使用理解创建空列表

问题描述

我想获得有关此代码的一些帮助:

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']}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...