我想从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
)提供窗口小部件,并实现自己从列表中查找相应的值,但我希望会有更多优雅的解决方案。
答案 0 :(得分:1)
您可以传递元组列表:
vals = list(zip(keys,values))
w = widgets.Select(options=vals, description='Select one of the values:')
答案 1 :(得分:0)
还需要考虑两个选项:
将值从浮点数映射到字符串:
w = widgets.Select(options=map(str,values), description='Select one of the values:')
在我看来,这更加惯用于创建一个字符串,其中包含值作为键的字符串。它也短得多:)。
使用有序的词典:
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或您接受的答案是不可能的。