当前位置: 首页 > 知识库问答 >
问题:

如何在列表理解中添加额外的中间步骤?

李良策
2023-03-14

假设我有一个输入。列出[str]对象,该对象包含“HH:mm”格式的时间戳,例如。

timestamps = ["22:58", "03:11", "12:21"]

我想把它转换成打字。列出[int]对象,并为每个时间戳列出“自午夜以来的分钟数”值:

converted = [22*60+58, 3*60+11, 12*60+21]

..., 但我想用一种风格,用一个列表来理解。我天真地构造了一个(语法上不正确的)实现

def timestamps_to_minutes(timestamps: typing.List[str]) -> typing.List[int]:
    return [int(hh) * 60 + int(mm) for ts in timestamps for hh, mm = ts.split(":")]

,但这不起作用,因为对于hh,mm=ts.split(“:”)不是有效的语法。。。

写同样的事情的有效方法是什么?

澄清一下:我可以看到一个形式上令人满意的解决方案

def timestamps_to_minutes(timestamps: typing.List[str]) -> typing.List[int]:
    return [int(ts.split(":")[0]) * 60 + int(ts.split(":")[1]) for ts in timestamps]

,但这是非常低效的,我不想把字符串拆分两次。

共有3个答案

柯天宇
2023-03-14

晚会迟到了。。但是为什么不使用datetime/timedelta来转换时间呢?

对于"hh: mm",这可能有点夸张,但您可以轻松地将其调整到更复杂的时间字符串:

from datetime import datetime as dt
import typing

def timestamps_to_minutes(timestamps: typing.List[str]) -> typing.List[any]:
    """Uses datetime.strptime to parse a datetime string and return
    minutes spent in this day."""
    return [int(((p := dt.strptime(t,"%H:%M")) - dt(p.year,p.month, p.day)
                 ).total_seconds()//60) for t in timestamps]

timestamps = ["22:58", "03:11", "12:21"]

print(timestamps_to_minutes(timestamps))

产出:

[1378, 191, 741]
锺离韬
2023-03-14

如果不想将字符串拆分两次,可以使用:=赋值运算符:

timestamps = [int((s := t.split(":"))[0]) * 60 + int(s[1]) for t in timestamps]
print(timestamps)

印刷品:

[1378, 191, 741]

备选方案:

print([int(h) * 60 + int(m) for h, m in (t.split(":") for t in timestamps)])

印刷品:

[1378, 191, 741]
许法
2023-03-14

可以使用内部生成器表达式进行拆分

[int(hh)*60 + int(mm) for hh, mm in (ts.split(':') for ts in timestamps)]

虽然就我个人而言,我宁愿使用助手函数:

def timestamp_to_minutes(timestamp: str) -> int:
    hh, mm = timestamp.split(":")
    return int(hh)*60 + int(mm)

[timestamp_to_minutes(ts) for ts in timestamps]

# Alternative
list(map(timestamp_to_minutes, timestamps))
 类似资料:
  • 问题内容: 假设我有一个NumPy数组a: 我想添加一列零以获取一个数组b: 我如何在NumPy中轻松地做到这一点? 问题答案: 我认为,更简单,更快速的启动方法是执行以下操作: 和时间:

  • 我有一个,作为布局管理器,我正在尝试获得这种安排: 忽略边框的额外深蓝色空间。 我总共有5列和3行,所有组件都将设置PreferredSize()设置为精确值,以完全适合同样具有首选大小(170 x 115)的JPanel。 问题是似乎在最后一列宽度上添加了30 pxls,因为仅在的宽度上添加了30 pxls(总共200个)组件显示正确,如下所示: 但由于额外的空间,最后一列被分隔开了。 它添加了

  • 我在MySQL中有一个名为的表 提供以下输出, 下面提供了表,

  • 问题内容: 我有这两个课(表) 还有这个: 运行此代码后,在数据库(student_course)中创建了一个额外的表,现在我想知道如何在该表中添加额外的字段,例如(Grade,Date和…(我的意思是student_course表)),我看到了一些解决方案,但我不喜欢它们,而且我对它们有一些问题: 第一个样品 问题答案: 如果在链接表(STUDENT_COURSE)上添加额外的字段,则必须根据s

  • 问题内容: 我想用三个表的联合创建视图。但是在结果查询中,我想要一个额外的列,例如“ tableId”。 我的代码就像 这给了我所需的三个表的并集。但是如何获取结果输出中的表ID列?该列在三个表中都不存在。 问题答案: 这听起来像你只是想一个额外的硬编码值添加到您的列表

  • 我正在编写一个Chrome扩展,它使用CryptoJS进行一些Apache Thrift工作。我目前正在尝试让CryptoJS工作。我面临着CryptoJS对CryptoJS加密的数据进行解密的问题。在问题描述之后,我在下面附上一个测试用例。 发生的事情如下,我有一个“字节”数组: 我用CryptoJS加密它,然后解密。加密前的前25个字节: 解密后: 唯一的区别是在位置20处增加了194个。显然