2016-01-26 1 views
1

Je veux choisir parmi une liste de valeurs possibles de type float:Comment commander des entrées dans ipywidgets Dropdown ou Select?

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

Le module ipywidgets fournit les widgets Select et qui acceptent Dropdown soit une liste de chaînes, ou un dictionnaire. Dans ce dernier cas, les touches seront affichées et les valeurs seront utilisées lorsque la touche correspondante est sélectionnée. Voir the list of widgets in the docs. En effet, la fourniture directe de ma liste de valeurs génère une erreur car les valeurs sont flottantes, et non pas des chaînes.

# This will raise a TraitError 
w = widgets.Select(options=values,description='Select one of the values:') 
display(w) 

donc créer un dictionnaire et passer ce au widget:

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) 

Cependant, étant donné que les dictionnaires ne sont pas triés, le widget résultant montre les options dans un ordre apparemment aléatoire. Dans ce cas, quand je l'ai couru, 498e-9 est venu avant 435e-9, comme le montre cette capture d'écran: screenshot of the resulting widget. Donc, la question est, est-il un moyen de trier les entrées dans les widgets de sélection? Une solution de contournement évidente est de fournir le widget uniquement avec ma liste de chaînes (appelée keys dans l'exemple ci-dessus) et d'implémenter la recherche de la valeur correspondante dans la liste, mais j'espérais qu'il y aurait une solution plus élégante.

+0

Avez-vous envisagé d'utiliser un dictionnaire trié? – nluigi

Répondre

1

Vous pouvez passer une liste de tuple:

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

Deux autres options à considérer:

  1. valeurs Carte des flotteurs à cordes:

    w = widgets.Select(options=map(str,values), description='Select one of the values:') 
    

    Ceci est à mon avis beaucoup plus idiomatique que la création d'un dictionnaire avec des chaînes de valeurs en tant que clés. C'est aussi beaucoup plus court :).

  2. Utilisez un dict commandé:

    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:') 
    

    L'avantage ici est que la liste names peut être tout ce que vous voulez, par exemple names=['choice 1','choice 2','choice 3']. Cela vous permet alors d'obtenir la valeur sélectionnée par od_vals[w.selected_label] ce qui n'est pas possible pour la méthode 1 ou votre réponse acceptée.