2009-04-18 8 views

Odpowiedz

64

Będziesz potrzebował użyć pętli lub listy/generatora. Jeśli chcesz na małe litery wszystkie klucze i wartości, można to zrobić ::

dict((k.lower(), v.lower()) for k,v in {'My Key':'My Value'}.iteritems()) 

Jeśli chcesz na małe odległości klawiszy, można to zrobić ::

dict((k.lower(), v) for k,v in {'My Key':'My Value'}.iteritems()) 

Generator expressions (stosowane przede) są często przydatne w tworzeniu słowników; Używam ich cały czas. Cała ekspresja pętli ze zrozumieniem bez żadnego obciążenia pamięci.

+1

Zakłada się, że klucze są ciągami. Jeśli masz wartość numeryczną jako klucz, to się nie powiedzie. – lorenzog

+2

'dict.iteritems()' jest usuwany z Pythona 3, zamiast tego użyj 'dict.items()'. –

+0

Dla Pythona 3 Odpowiedź damio: http://stackoverflow.com/a/4223871/674648 – Delblanco

13

Poniżej jest identyczna odpowiedź Rick Copeland, zaledwie pisemnej bez używając wyrażenia generatora:

outdict = {} 
for k, v in {'My Key': 'My Value'}.iteritems(): 
    outdict[k.lower()] = v.lower() 

generator wyrażeń, lista zrozumienie i (w Pythonie 2.7 i wyższe) DICT zrozumienie są w zasadzie sposoby poprawiania pętle .

W Pythonie 2.7+, można użyć słownika zrozumieniem (jest to pojedyncza linia kodu, ale można sformatować je uczynić go bardziej czytelnym):

{k.lower():v.lower() 
    for k, v in 
    {'My Key': 'My Value'}.items() 
} 

Są one dość często porządniej niż pętli równoważny, ponieważ nie musisz inicjować pustego dict/list/etc ... ale jeśli potrzebujesz zrobić coś więcej niż pojedyncze wywołanie funkcji/metody, mogą szybko stać się bałaganiarskie.

+4

+1 dla zrozumienia dict. – Stephan202

+0

jak uogólnić to dla przypadku, w którym słownik ma więcej niż jeden klucz i> 1 wartości dla każdego klucza? – user1993

2

Jeśli podany słownik ma wiele typów kluczy/wartości (numeryczne, ciąg itp.); następnie użyj następującego rozwiązania.

Na przykład; jeśli masz słownika nazwie mydict jak pokazano poniżej

mydict = {"FName":"John","LName":"Doe",007:true} 

w Pythonie 2.x

dict((k.lower() if isinstance(k, basestring) else k, v.lower() if isinstance(v, basestring) else v) for k,v in mydict.iteritems()) 

w Pythonie 3.x

dict((k.lower() if isinstance(k, str) else k, v.lower() if isinstance(v, str) else v) for k,v in mydict.iteritems()) 

UWAGA: Ta działa dobrze na słownikach jednowymiarowych

+0

W tym momencie chciałbym po prostu wykonać niższą funkcję, która sprawdza. 'try_lower = lambda k: k.lower(), jeśli isinstance (k, str) else k' –

-1
def convert_to_lower_case(data): 
    if type(data) is dict: 
     for k, v in data.iteritems(): 
      if type(v) is str: 
       data[k] = v.lower() 
      elif type(v) is list: 
       data[k] = [x.lower() for x in v] 
      elif type(v) is dict: 
       data[k] = convert_to_lower_case(v) 
    return data 
3

Krótsza droga w Pythonie 3:{k.lower(): v for k, v in my_dict.items()}

0

Jeśli chcesz klucze i wartości zagnieżdżonego słowniku (małymi literami) w formacie JSON, to może pomóc. Potrzebujesz wsparcia w zakresie interpretacji słów, co powinno być w Pythonie 2.7

def _lowercase(obj): 
     """ Make dictionary lowercase """ 
     if isinstance(obj, dict): 
      return {k.lower():_lowercase(v) for k, v in obj.iteritems()} 
     elif isinstance(obj, list): 
      return [_lowercase(k) for k in obj] 
     elif isinstance(obj, basestring): 
      return obj.lower() 
     else: 
      return obj 
0

Miłość sposób można użyć funkcji wielopoziomowych, tu jest mój sposób na małe-ing klawiszy

def to_lower(dictionary): 

    def try_iterate(k): 
     return lower_by_level(k) if isinstance(k, dict) else k 

    def try_lower(k): 
     return k.lower() if isinstance(k, str) else k 

    def lower_by_level(data): 
     return dict((try_lower(k), try_iterate(v)) for k, v in data.items()) 

    return lower_by_level(dictionary) 
1

ja odpowiadam tak późno - jako pytanie jest oznaczone Python. Stąd odpowiadanie na rozwiązanie dla obu Python 2.x i Python 3.x, a także obsługa przypadku kluczy niepodpisanych.

Python 2.x - używając słownika zrozumienie

{k.lower() if isinstance(k, basestring) else k: v.lower() if isinstance(v, basestring) else v for k,v in yourDict.iteritems()} 

Demo:

>>> yourDict = {"Domain":"WORKGROUP", "Name": "CA-LTP-JOHN", 111: 'OK', "Is_ADServer": 0, "Is_ConnectionBroker": 0, "Domain_Pingable": 0} 
>>> {k.lower() if isinstance(k, basestring) else k: v.lower() if isinstance(v, basestring) else v for k,v in yourDict.iteritems()} 
{'domain': 'workgroup', 'name': 'ca-ltp-john', 'is_adserver': 0, 'is_connectionbroker': 0, 111: 'ok', 'domain_pingable': 0} 

Python 3.x - no iteritems() w Pythonie 3.x

{k.lower() if isinstance(k, str) else k: v.lower() if isinstance(v, str) else v for k,v in yourDict.items()} 

Demo:

>>> dict((k.lower() if isinstance(k, basestring) else k, v.lower() if isinstance(v, basestring) else v) for k,v in yourDict.iteritems()) 
Traceback (most recent call last): 
    File "python", line 1, in <module> 
AttributeError: 'dict' object has no attribute 'iteritems' 
>>> {k.lower() if isinstance(k, str) else k: v.lower() if isinstance(v, str) else v for k,v in yourDict.items()} 
>>> {'domain': 'workgroup', 'name': 'ca-ltp-john', 111: 'ok', 'is_adserver': 0, 'is_connectionbroker': 0, 'domain_pingable': 0} 
Powiązane problemy