【问题标题】:How to order entries in ipywidgets Dropdown or Select?如何在 ipywidgets Dropdown 或 Select 中排序条目?
【发布时间】:2016-01-26 20:53:32
【问题描述】:

我想从浮点类型的可能值列表中进行选择:

values = [400e-9,435e-9,498e-9]

ipywidgets 模块提供 Select 和 Dropdown 小部件,它们接受字符串列表或字典。在后一种情况下,将显示键并在选择相应键时使用值。见the list of widgets in the docs

# Required imports for examples below
import ipywidgets as widgets
from IPython.display import display

确实,直接提供我的值列表会引发错误,因为这些值是浮点数,而不是字符串。

# This will raise a TraitError
w = widgets.Select(options=values,description='Select one of the values:')
display(w)

所以我创建了一个字典并将其传递给小部件:

keys = ["{:.2e}".format(val) for val in values]
valsdict = dict(zip(keys,values))
w = widgets.Select(options=valsdict, description='Select one of the values:')
display(w)

但是,由于字典未排序,因此生成的小部件以看似随机的顺序显示选项。在这种情况下,当我运行它时,498e-9 出现在 435e-9 之前,如下图所示:screenshot of the resulting widget

所以问题是,有没有办法对选择小部件中的条目进行排序?

一个明显的解决方法是只为小部件提供我的字符串列表(在上面的示例中称为keys)并自己实现从列表中查找相应的值,但我希望有一个更优雅的解决方案.

【问题讨论】:

  • 你考虑过使用排序字典吗?

标签: python jupyter jupyter-notebook ipywidgets


【解决方案1】:

你可以传递一个元组列表:

vals = list(zip(keys,values))
w = widgets.Select(options=vals, description='Select one of the values:')

【讨论】:

    【解决方案2】:

    另外两个选择:

    1. 将值从浮点数映射到字符串:

      w = widgets.Select(options=map(str,values), description='Select one of the values:')
      

      在我看来,这比创建一个以字符串作为键的字典要习惯得多。它也短得多:)。

    2. 使用有序字典:

      from collections import OrderedDict
      names = map(str,values)
      od_vals = OrderedDict(zip(names,values))
      w = widgets.Select(options=od_vals, description='Select one of the values:')
      

      这里的优点是列表names 可以是您想要的任何东西,例如names=['choice 1','choice 2','choice 3']。然后,这允许您获得 od_vals[w.selected_label] 选择的值,这对于方法 1 或您接受的答案是不可能的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-06
      • 2021-03-21
      • 2018-08-07
      • 1970-01-01
      • 2015-08-11
      • 1970-01-01
      • 2010-11-27
      • 2019-03-06
      相关资源
      最近更新 更多