życzę, aby to zrobić, ale dla słownika:Słownik na małe litery w Pythonie
"My string".lower()
Czy jest wbudowany w funkcji lub powinien użyć pętli?
życzę, aby to zrobić, ale dla słownika:Słownik na małe litery w Pythonie
"My string".lower()
Czy jest wbudowany w funkcji lub powinien użyć pętli?
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.
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.
+1 dla zrozumienia dict. – Stephan202
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
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
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' –
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
Krótsza droga w Pythonie 3:{k.lower(): v for k, v in my_dict.items()}
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
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)
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}
na klucze, wartości, czy jedno i drugie? – hasen
dla obu z nich – Teifion