如何在ipywidgets Dropdown或Select中订购条目?

时间:2016-01-26 20:53:33

标签: python jupyter jupyter-notebook ipywidgets

我想从float:

类型的可能值列表中进行选择
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)提供窗口小部件,并实现自己从列表中查找相应的值,但我希望会有更多优雅的解决方案。

2 个答案:

答案 0 :(得分:1)

您可以传递元组列表:

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

答案 1 :(得分:0)

还需要考虑两个选项:

  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或您接受的答案是不可能的。