Python 如何在ipywidgets下拉列表或选择列表中对条目排序?

Python 如何在ipywidgets下拉列表或选择列表中对条目排序?,python,jupyter,jupyter-notebook,ipywidgets,Python,Jupyter,Jupyter Notebook,Ipywidgets,我想从float类型的可能值列表中选择: values = [400e-9,435e-9,498e-9] ipywidgets模块提供选择和下拉小部件,它们接受字符串列表或字典。在后一种情况下,当选择相应的键时,将显示键并使用值。看 事实上,提供我的值列表会直接引发错误,因为这些值是浮点数,而不是字符串 # This will raise a TraitError w = widgets.Select(options=values,description='Select one of the

我想从float类型的可能值列表中选择:

values = [400e-9,435e-9,498e-9]
ipywidgets模块提供选择和下拉小部件,它们接受字符串列表或字典。在后一种情况下,当选择相应的键时,将显示键并使用值。看

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

# 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之前,如以下屏幕截图所示:

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


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

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

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

还有两种选择需要考虑:

  • 将值从浮点映射到字符串:

    w = widgets.Select(options=map(str,values), description='Select one of the values:')
    
    在我看来,这比创建一个以字符串作为键的字典更为惯用。它也短得多:)

  • 使用有序的dict:

    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:')
    
    这里的优点是,列表
    名称可以是您想要的任何内容,例如
    名称=['choice 1'、'choice 2'、'choice 3']
    。然后,您可以通过
    od\u vals[w.selected\u label]
    获取所选值,这对于方法1或您接受的答案是不可能的


  • 你考虑过使用分类词典吗?
    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:')