2009-05-05 63 views
3

我很好奇如何Python的忍者在這裏會做以下,典雅,pythonically:優雅的pythonic解決方案強制Unicode字符串嵌套字典中的所有鍵和值小寫?

我有一個數據結構,是從unicode字符串的字典從unicode字符串到unicode字符串列表類型的字典。所以:

>>> type(myDict) 
<type 'dict'> 
>>> type(myDict[u'myKey']) 
<type 'dict'> 
>>> type(myDict[u'myKey'][u'myKey2']) 
<type 'list'> 
>>> type(myDict[u'myKey'][u'myKey2'][0]) 
<type 'unicode'> 

我想通過,並盡一切字符串中它小寫,即每一個鍵,並在每個列表中的每個字符串。

你會如何做到這一點?

+0

-1在標題 – Sparr 2009-05-05 02:41:22

+0

哎呀什麼也不說你的問題很有用...對不起。不過,無論如何都得到了一些好的答案。謝謝,所有! – David 2009-05-05 03:09:32

+0

確定它很明顯,但是如果您確定沒有僅由大小寫區分的密鑰,這隻有一個很好的解決方案。例如如果您在原始列表中有'myKey2'和'MyKey2'以及'mykey2'... – si28719e 2009-05-05 03:42:04

回答

19

非常簡單的方法,雖然我不知道你'd稱之爲Pythonic:

newDict = eval(repr(myDict).lower()) 

理智的方式:

newDict = dict((k1.lower(), 
       dict((k2.lower(), 
         [s.lower() for s in v2]) for k2, v2 in v1.iteritems())) 
       for k1, v1 in myDict.iteritems()) 
+3

+1橫向思維:-) – 2009-05-05 02:41:36

+0

+1多一個相同。這讓我微笑。 – si28719e 2009-05-05 03:39:20

+0

我實際上並不會使用eval/repr方法,而是對我從來沒有想過的東西進行+1 :-) – 2009-05-05 16:04:39

1

您輸入例以下工作:

>>> myDict = {'myKey': {'myKey2': [u'Abc']}} 
>>> newDict = dict([ 
     (k1.lower(), dict([ 
      (k2.lower(), [x.lower() for x in myDict[k1][k2]]) 
       for k2 in myDict[k1].keys() 
     ])) for k1 in myDict.keys() 
    ]) 
>>> newDict 
{'mykey': {'mykey2': [u'abc']}} 
3

遞歸變種:

def make_lowercase(obj): 
    if hasattr(obj,'iteritems'): 
     # dictionary 
     ret = {} 
     for k,v in obj.iteritems(): 
      ret[make_lowercase(k)] = make_lowercase(v) 
     return ret 
    elif isinstance(obj,basestring): 
     # string 
     return obj.lower() 
    elif hasattr(obj,'__iter__'): 
     # list (or the like) 
     ret = [] 
     for item in obj: 
      ret.append(make_lowercase(item)) 
     return ret 
    else: 
     # anything else 
     return obj 

例子:

>>> make_lowercase({'Foo': [{1: 'Baz', 'Bar': 2}]}) 
{'foo': [{1: 'baz', 'bar': 2}]} 
0

如果你不介意修改您的輸入:

def make_lower(x): 
    try: 
     return x.lower() # x is a string 
    except AttributeError: 
     # assume x is a dict of the appropriate form 
     for key in x.keys(): 
      x[key.lower()] = make_lower(x[key]) 
      if key != key.lower(): 
       del x[key] 

    return x 

make_lower(myDict) 
0

我回答這麼晚 - 因爲這個問題被標記Python。 因此,回答Python 2.xPython 3.x的解決方案,並且還處理非字符串鍵的情況,即在數字鍵的情況下,接受答案中的解決方案將失敗。

的Python 2.x的 - 使用字典解析

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

演示

>>> 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都有

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

演示

>>> 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}