微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用理解创建空列表

如何解决使用理解创建空列表

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

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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?