2009-04-18 13 views

Antwort

64

Sie müssen entweder eine Schleife oder ein Listen/Generator-Verständnis verwenden. Wenn Sie alle Schlüssel und Werte in Kleinbuchstaben möchten, können Sie dies tun ::

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

Wenn Sie nur die Schlüssel in Kleinbuchstaben möchten, können Sie dies tun ::

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

Generator expressions (oben verwendet) sind oft nützlich beim Erstellen von Wörterbüchern; Ich benutze sie die ganze Zeit. Die ganze Expressivität eines Schleifenverständnisses ohne den Overhead des Speichers.

+1

Dies setzt voraus, dass die Schlüssel Strings sind. Wenn Sie einen numerischen Wert als Schlüssel haben, wird es fehlschlagen. – lorenzog

+2

'dict.iteritems()' wird aus Python 3 entfernt, stattdessen verwenden Sie 'dict.items()'. –

+0

Für Python 3 damios Antwort: http://stackoverflow.com/a/4223871/674648 – Delblanco

13

Das folgende ist identisch mit Rick Copeland Antwort, geschrieben ohne Verwendung Generator Ausdruck:

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

Generator-Ausdrücke, Liste Verständnis der und (in Python 2.7 und höher) dict Verständnis der grundsätzlich Möglichkeiten von Schleifen Umschreiben .

In Python 2.7+ können Sie ein Wörterbuch Verständnis verwenden (es ist eine einzige Zeile Code, aber Sie können sie neu formatiert, um sie besser lesbar):

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

Sie sind recht häufig aufgeräumter als die Schleife Äquivalent, da Sie kein leeres dict/list/etc. initialisieren müssen. Wenn Sie jedoch mehr als einen einzigen Funktions/Methoden-Aufruf ausführen müssen, können sie schnell unordentlich werden.

+4

+1 für Diktat Verständnis. – Stephan202

+0

Wie verallgemeinern Sie dies für einen Fall, in dem das Wörterbuch mehr als einen Schlüssel und> 1 Werte für jeden Schlüssel hat? – user1993

2

Wenn das mitgelieferte Wörterbuch mehrere Schlüssel-/Werttypen (numerisch, Zeichenfolge usw.) enthält; Verwenden Sie dann die folgende Lösung.

Zum Beispiel; wenn Sie ein Wörterbuch myDict genannt haben, wie unten

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

In Python 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()) 

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()) 

Hinweis: In Python gezeigt: dieses funktioniert gut bei eindimensionalen Wörterbüchern

+0

An dieser Stelle würde ich nur eine niedrigere Funktion machen, die die Überprüfung durchführt. 'try_lower = lambda k: k.lower() falls 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

Kürzere Weg in Python 3:{k.lower(): v for k, v in my_dict.items()}

0

Wenn Sie Schlüssel und Werte von verschachtelter Wörterbuch (JSON-Format) Klein wollen, dies helfen könnte. Benötigt Unterstützung für dict comprehensions, was in Python 2 sein sollte.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

Liebe der Art, wie Sie Multi-Level-Funktionen nutzen zu können, hier ist meine Art von Klein-ing der Tasten

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

Ich antworte so spät - wie die Frage Python markiert. Daher mit einer Lösung für beide Python 2.x und Python 3.x beantworten und auch den Fall von Nicht-String-Schlüssel behandeln.

Python 2.x - mit Wörterbuch Verständnis

{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 - keine iteritems() in Python 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} 
Verwandte Themen