python - 如何编写具有依赖于比较和存储值的列表理解的单行代码?

标签 python python-3.x list-comprehension

我有 lines = ["222,333", ...] 如何重写以下内容:

res = 0
result = []
for line in lines:
   body, exp = line.split(',')
   logr = math.log(int(body), int(exp))
   if logr > res:
       res = logr
       result = [int(body), int(exp)]

进入单线?

我正在尝试类似的东西

result = [math.log(int(d.split(',')[0]), int(d.split(',')[1])) for d in lines]

但在我这样做之后,我被卡住了。如何将我的 math.log 与之前的结果进行比较,如果它更大,则将其写入某个变量?

我希望输出为 "333,444" 或类似的东西。

最佳答案

result 一行,res 一行:

result = max([[*map(int,d.split(','))] for d in lines], key=lambda p: math.log(*p))
res = math.log(*result)

多田 🎉

这是什么魔法?

要意识到的一点是 result 最终将只是一个长度为 2 的列表:[body, exp]。这个列表由 logr > res 决定——一个 key 来排序——暗示使用 minsortedmax 或类似的。

立即评估日志的问题,如问题中的尝试所示,是我们丢失了从 split(', ') 获得的值。但是我们需要这些值来获取 result!相反,保留值,首先确定正确的对,然后评估日志。

现在到了单行。理解的第一部分相当简单。

[[*map(int,d.split(','))] for d in lines]

这将创建一个已解析行列表的列表。

["111,222", "333,444", "555,666"]  # before (lines)
[[111, 222],
 [333, 444],
 [555, 666]]    # after (list comp.)

然后我们选择具有最高 log 的对。换句话说,我们采用 max,通过 key=lambda p: math.log(*p) 的键进行比较(即通过日志进行比较)。

(如果您想知道星号的作用,它会解压给定的可迭代对象(有关更多信息,请参阅 What does the star operator mean?)。在这种特殊情况下,math.log(*p) 是与 math.log(p[0], p[1]).)

相同

一旦我们选择了结果,我们将其再次放入 math.log 以计算 res

一切都很好。

关于python - 如何编写具有依赖于比较和存储值的列表理解的单行代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55995118/

相关文章:

python - 将字符串重新渲染为原始字符串

python - 使用 asyncio 和 contextvars 在 python 中的两个异步程序之间共享状态

python - 我想使用 pyqt5 的拖放方法获取并显示图像

python - 检查 python 3 支持的要求

python - 基于具有非空值的另一列,使用 lambda 在数据框中创建一列

Python:使用列表理解将链表转换为列表?

python - 不确定我是否应该使用线程?

python - 查找字典中的值变化和索引

嵌套循环中的python列表理解

python - 确定 x 对于 float 和 timedelta 是否均为正