2013-07-29 14 views
9

Po CSV importu, mam następujący słownik z kluczami w innym języku:zastąpić słownika klucze (łańcuchy) w Pythonie

dic = {'voornaam': 'John', 'Achternaam': 'Davis', 'telephone': '123456', 'Mobielnummer': '234567'} 

Teraz chcę zmienić klucze do angielskiego i (również do wszystkich małych liter). Które powinno być:

dic = {'first_name': 'John', 'last_name': 'Davis', 'phone': '123456', 'mobile': '234567'} 

Jak mogę to osiągnąć?

+1

Dlaczego downvotes? Myślę, że muszę wiedzieć, dlaczego tak mogę poprawić pytanie. – chhantyal

+0

Pytanie nie wykazuje dużego nakładu pracy badawczej. Na przykład, jakie podejście ma dla ciebie sens? Czy próbowałeś wdrożyć któryś z nich? Co się stało, kiedy próbowałeś? – kojiro

Odpowiedz

23

masz typ słownika, to idealnie pasuje

>>> dic = {'voornaam': 'John', 'Achternaam': 'Davis', 'telephone': '123456', 'Mobielnummer': '234567'} 
>>> tr = {'voornaam':'first_name', 'Achternaam':'last_name', 'telephone':'phone', 'Mobielnummer':'mobile'} 
>>> dic = {tr[k]: v for k, v in dic.items()} 
{'mobile': '234567', 'phone': '123456', 'first_name': 'John', 'last_name': 'Davis'} 
+0

wygląda świetnie, dzięki :) – chhantyal

+0

Nie sądzę, że OP chce konwertować wartości na lowecase, czy coś przeoczyłem? –

+0

Tak, naprawdę chcę, żeby klucze były angielskie i wszystkie małe, a nie wartości. – chhantyal

1
name_mapping = { 
    'voornaam': 'first_name', 
    ... 
} 

dic = your_dict 

# Can't iterate over collection being modified, 
# so change the iterable being iterated. 
for old, new in name_mapping.iteritems(): 
    value = dic.get(old, None) 
    if value is None: 
     continue 

    dic[new] = value 
    del dic[old] 
1

Przede rozwiązanie działa świetnie, jeśli nie istnieją żadne zagnieżdżone słownika obiektów w dict wejściowego.

Poniżej znajduje się bardziej uogólniona funkcja narzędzia, która zastępuje istniejące klucze nowym zbiorem kluczy rekursywnie.

def update_dict_keys(obj, mapping_dict): 
    if isinstance(obj, dict): 
     return {mapping_dict[k]: update_dict_keys(v, mapping_dict) for k, v in obj.iteritems()} 
else: 
    return obj 

Test:

dic = {'voornaam': 'John', 'Achternaam': 'Davis', 
'telephone':'123456', 'Mobielnummer': '234567', 
"a": {'Achternaam':'Davis'}} 
tr = {'voornaam': 'first_name', 'Achternaam': 'last_name', 
'telephone':'phone', 'Mobielnummer': 'mobile', "a": "test"} 

wyjścia:

{ 
'test': { 
    'last_name': 'Davis' 
}, 
'mobile': '234567', 
'first_name': 'John', 
'last_name': 'Davis', 
'phone': '123456' 
} 
Powiązane problemy