2016-08-16 123 views
3

我有一個嵌套的字典,我想,以取代有一個空格,然後用數字(vlc 2.2ado 3.4ultr 3.1)只是他們的名字的名單,即vlc所有的字符串, adoultr。這裏是輸入字典:蟒蛇:替換字符串中嵌套的字典

input = {'cl1': {'to_do': ['ab', 
'dir8', 
'cop', 
'vlc 2.2.2.0', 
'7zi', 
'7zi', 
'ado 3.4']}, 
'cl2': {'to_do': ['ultr 3.1', 'ab']}} 

這應該是輸出:

result = {'cl1': {'to_do': ['ab', 
'dir8', 
'cop', 
'vlc', 
'7zi', 
'7zi', 
'ado']}, 
'cl2': {'to_do': ['ultr', 'ab']}} 

我想是這樣的:

for k in input: 
    for e in input[k]['to_do']: 
     input[k]['to_do'] = e.replace(e, e.split()[0]) 

得到錯誤輸出:

{'cl1': {'to_do': 'ado'}, 'cl2': {'to_do': 'ab'}} 

我不完全理解w這是錯誤。任何幫助?謝謝

+0

是否有空格的字符串不是後跟數字,例如: 'ab cd',你想在這種情況下保留後半部分嗎? –

+0

@tobias_k帶空格的字符串後面只有數字 – diegus

回答

2

當你這樣做:

input[k]['to_do'] = e.replace(e, e.split()[0]) 

更換了初始l陣列(['ultr 3.1', 'ab']['ab', 'dir8', 'cop', 'vlc 2.2.2.0', '7zi', '7zi', 'ado 3.4'])由單個值(循環中處理的最後一個值)。

您只需在這一條線上,以取代內部循環,使其工作:

input[k]['to_do'] = [e.split()[0] for e in input[k]['to_do']] 

正確的結果給出:

{'cl2': {'to_do': ['ultr', 'ab']}, 
    'cl1': {'to_do': ['ab', 'dir8', 'cop', 'vlc', '7zi', '7zi', 'ado']}} 
+0

謝謝你的解釋。它效果很好 – diegus

+0

「你只需要替換上面的行」實際上,你應該用該行替換整個內部循環,而不僅僅是循環內的賦值。 –

0

如果您想剝離to_do列表中的空格之後的任何東西,此解決方案將起作用。這似乎意味着當前的實現,但如果只需要數字,則需要使用正則表達式。

的Python 2

d = { 
    'cl1': { 
     'to_do': [ 
      'ab', 
      'dir8', 
      'cop', 
      'vlc 2.2.2.0', 
      '7zi', 
      '7zi', 
      'ado 3.4' 
     ] 
    }, 
    'cl2': { 
     'to_do': [ 
      'ultr 3.1', 
      'ab' 
     ] 
    } 
} 

for inner_dict in d.itervalues(): 
    inner_dict['to_do'] = [x.split()[0] for x in inner_dict['to_do']] 

print d # {'cl1': {'to_do': ['ab', 'dir8', 'cop', 'vlc', '7zi', '7zi', 'ado']}, 'cl2': {'to_do': ['ultr', 'ab']}} 

的Python 3(假設同d):

for inner_dict in d.values(): 
    inner_dict['to_do'] = [x.split()[0] for x in inner_dict['to_do']] 

print(d) 
+0

這對我很有用。謝謝! – diegus

0

一種更通用的方法來做到這一點會是要創建一個遞歸方法,這又稱爲自己:

def recursive_split(input, search): 
    # check whether it's a dict, list, tuple, or scalar 
    if isinstance(input, dict): 
     items = input.items() 
    elif isinstance(input, (list, tuple)): 
     items = enumerate(input) 
    else: 
     # just a value, split and return 
     return str(input).split(search)[0] 

    # now call ourself for every value and replace in the input 
    for key, value in items: 
     input[key] = recursive_split(value, search) 
    return input 

請注意,這種方法使用就地替換,但可以輕鬆轉換爲返回新字典。這應該包含任何包含任何類型值的結構,可以將其轉換爲字符串。在你的情況下,你可以使用它,只需撥打電話:

d = recursive_split(d, " ")