2013-08-06 13 views
8

Czy istnieje sposób podpowiedzi, aby przypisać wartości słownika do jego kluczy, aby przekonwertować wpisy słownika na zmienne? Próbowałem to uwagę:Konwertuj wpisy słownika na zmienne - python

>>> d = {'a':1, 'b':2} 
>>> for key,val in d.items(): 
     exec('exec(key)=val') 

     exec(key)=val 
       ^
     SyntaxError: invalid syntax 

UPDATE: Może powinienem być bardziej konkretne: Jestem właściwie pewien, że pary klucz-wartość są prawidłowe, ponieważ zostały one uprzednio zdefiniowane jako zmienne przeze mnie wcześniej. Następnie zapisałem te zmienne w słowniku (jako pary klucz-wartość) i chciałbym je ponownie wykorzystać w innej funkcji. Mogłem po prostu zdefiniować je ponownie w nowej funkcji, ale ponieważ mogę mieć słownik z około 20 wpisami, pomyślałem, że może być bardziej skuteczny sposób robienia tego.

+9

[Zachowaj dane poza nazwami zmiennych] (http://nedbatchelder.com/blog/201112/keep_data_out_of_your_variable_names.html). – delnan

+2

Nie jest dobrym pomysłem dynamiczne tworzenie zmiennych. –

+0

prawdopodobny duplikat [Tworzenie dynamicznie nazwanych zmiennych z danych wprowadzanych przez użytkownika] (http://stackoverflow.com/questions/11354214/creating-dynamicznie-nazwany-zmiennych-z-użytkownika-inputu) –

Odpowiedz

17

To było to, czego szukał:

>>> d = {'a':1, 'b':2} 
>>> for key,val in d.items(): 
     exec(key + '=val') 
+1

jeśli tylko można to zrobić z jednej linijki. – dbliss

+3

'lista (map (exec, (" {0} = {1} ". Format (x [0], x [1]) dla x in d.items())))' – timkofu

+1

[To zawiedzie wewnątrz funkcji na Pythonie 3.] (http://ideone.com/aYczDb) – user2357112

6

Masz już doskonale dobry słownik. Po prostu użyj tego. Jeśli wiesz, co klawisze będą, i jesteś absolutnie pewien, że to rozsądny pomysł, można zrobić coś jak

a, b = d['a'], d['b'] 

ale przez większość czasu, należy po prostu korzystać ze słownika. (Jeśli używanie słownika jest niewygodne, prawdopodobnie nie porządkujesz dobrze swoich danych, poproś o pomoc w reorganizacji.)

+0

Dzięki za odpowiedź. Tak, jestem pewien, jakie będą klucze, ponieważ je stworzyłem i po prostu chcę używać dokładnie tych samych nazw zmiennych w innym miejscu. Właśnie zastanawiałem się, czy jest to bardziej automatyczny sposób, ponieważ mogę mieć ponad 20 wpisów. – HappyPy

+2

@ user2635863: Być może szukasz klasy [http://docs.python.org/2/tutorial/classes.html]. Jeśli masz 20 zmiennych, które wszystkie wymagają zapisania, masz problem. – user2357112

3

Rozważ rozwiązanie "Bunch" w Python: load variables in a dict into namespace. Twoje zmienne kończą się jako część nowego obiektu, a nie locals, ale możesz traktować je jako zmienne zamiast wpisów dyktowanych.

class Bunch(object): 
    def __init__(self, adict): 
    self.__dict__.update(adict) 

d = {'a':1, 'b':2} 
vars = Bunch(d) 
print vars.a, vars.b 
-1

użytkowania pand:

import pandas as pd 
var=pd.Series({'a':1, 'b':2}) 
#update both keys and variables 
var.a=3 
print(var.a,var['a']) 
+1

Uwielbiam pandy, ale może to być przesada (wymagające pandy tylko po to, aby uzyskać zmienne jako element pomocniczy). –

25

Można to zrobić w jednej linii z:

>>> d = {'a':1, 'b':2} 
>>> locals().update(d) 
>>> a 
1 

I zobaczyłem to rozwiązanie w another thread. Chociaż you should be careful with how Python may optimize locals/globals access when using this trick.

Zawsze wolałbym używać a class to hold the variables instead (jako przestrzeni nazw).

+1

Uwaga, nie działa w funkcji. \t (Będzie "działać" z globals() ale przydzieli zmienne globalne, nie lokalne dla funkcji ...) –

+0

Mam błąd "AttributeError:" obiekt builtin_function_or_method "nie ma atrybutu" update ", dlaczego? –

+1

@CharlieParker Może zapomniałeś nawiasów? – Peque

Powiązane problemy