我有 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 来排序——暗示使用 min
, sorted
、max
或类似的。
立即评估日志的问题,如问题中的尝试所示,是我们丢失了从 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/