在 ipython 笔记本中的下拉小部件中对值进行排序

Sorting the values within a dropdown widget in ipython notebook

我想使用 IPython 笔记本小部件中的下拉小部件。一个简单的例子如下所示...

from IPython.display import display
from IPython.html    import widgets
import random

genName = lambda : ''.join([chr(random.randint(65, 90)) for i in range(10) ])

testValues = [ genName() for i in range(20) ]
testValues = sorted(testValues)
testValues = dict(zip(testValues, testValues)) # This is not sorted because it is a dict
xx = widgets.DropdownWidget(values=testValues)

display(xx)

现在,要在 DropdownWidget 中插入的值接受字典,众所周知,这不是排序元素。这样做的问题是,当我们想要创建一个小部件并按特定顺序在下拉列表中排列 valeus 时,就无法完成,如上例所示。

在我使用的示例中,我创建了一组小部件,允许用户使用下拉小部件 select 文件。我希望文件按日期排序。但是,由于添加值的方式(使用字典),我似乎无法有效地做到这一点。

有人知道如何解决这个问题吗?

至少有2个选项:

  1. 使用 OrderedDict 而不是经典字典,例如

    from collections import OrderedDict
    ...
    testValues = OrderedDict(zip(testValues, testValues)) # from your example
    
  2. 如果不要求选择和得到的值不同, 您可以使用列表而不是 dict,如 here 所示。这样,小部件的值始终等于所选文本。你的例子看起来像

    ...
    testValues = [ genName() for i in range(20) ]
    testValues = sorted(testValues)
    xx = widgets.DropdownWidget(values=testValues)
    ...
    

根据您的代码,我假设您使用的是 IPython 2.x。请注意,在 IPython 3.x 中,小部件称为 widgets.Dropdown,关键字 values 现在是 options.