繁体   English   中英

如何使用 lambda function 应用计数器或其他索引元素?

[英]How to apply a counter or otherwise index elements using a lambda function?

类似的问题已被问到这里这里,但我无法让它适用于我的特定用例,即Plotlyfor_each_trace功能,可以像这样使用:

fig.for_each_trace(lambda t: t.update(name = 'line'))

现在,考虑这样一种情况,我想用'line' + i重命名 Plotly 图中的所有行,得到如下结果:

在此处输入图像描述

还有很多其他方法可以做到这一点,但我真的很想知道如何使用

fig.for_each_trace(lambda t: t.update(name = 'line')) # pluss some counter functionality

一种可能性是使用itertools中的cycle

from itertools import cycle
titles = cycle([1, 2])
fig.for_each_trace(lambda t: t.update(name = 'line ' + str(next(titles))))

一个完整的片段是:

import plotly.graph_objects as go
from itertools import cycle

titles = cycle([1, 2])

fig = go.Figure()
fig.add_traces(go.Scatter(x=[1,2,3], y=[1,2,3],))
fig.add_traces(go.Scatter(x=[1,2,3], y=[3,2,1]))

fig.for_each_trace(lambda t: t.update(name = 'line ' + str(next(titles))))

fig.show()

但我希望能够在没有循环的情况下做到这一点。 我试过以几种方式使用enumerate ,但没有成功。 那么,有没有人知道如何正确应用enumerate或以其他方式合并计数器,以便可以在fig.for_each_trace()中索引列表:

lst = [1, 2]
fig.for_each_trace(lambda t: t.update(name = 'line ' + str(lst[i])))

如果您想将计数器和更新方法组合在一起,而不是使用lambda我可能会这样做:

def trace_name_updater():
    counter = itertools.count(start=1)
    def update_trace_name(t):
        t.update(name=f'line {next(counter)}')

    return update_trace_name

并像这样使用它:

fig.for_each_trace(trace_name_updater())

在这种情况下,计数器将位于返回的update_trace_name function 的闭包中。

再次调用trace_name_updater()将提供一个新的计数器。

我的问题仍然是,如果您可以在初始化时设置跟踪名称,那么为什么您需要这样做,但也许您的问题中没有解释原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM