2

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

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

ipywidgets 模块提供 Select 和 Dropdown 小部件,它们接受字符串列表或字典。在后一种情况下,将显示键并在选择相应键时使用值。请参阅文档中的小部件列表

# 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 results widget

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

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

4

2 回答 2

2

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

vals = list(zip(keys,values))
w = widgets.Select(options=vals, description='Select one of the values:')
于 2016-02-01T12:32:13.533 回答
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 或您接受的答案无法选择的值。

于 2016-03-08T13:07:52.057 回答