2016-02-12 215 views
-1

我有字典詞典的值,如:蟒蛇查找字典在字典

myDict = {'custom_field1': {'label': 'CNAMEs', 'data': 'bar1 bar2' }, 
      'custom_field2': {'label': 'LocalForward', 'data': '8080:localhost:80' }, 
      'custom_field3': None, 
      'custom_field4': {'label': 'ProxyCommand', 'data': 'ssh -q [email protected] nc -q0 %h 22' }, 
      'custom_field5': {'label': 'SomeMoreInfos', 'data': 'AboutSomethingElse' }, 
      'created_by': {'username': 'someperson', 'date': 'recently' }, 
      'name': 'hostname' 
     } 

中有我不關心字典許多其他鍵/值。獲取標籤爲foo的custom_field的數據,然後標籤爲bar的數據,然後標籤更多的數據的數據是一種簡單的方法? 因爲目前我做這樣的:

customItem = [] 
for field in range(1, 10): 
    new_field = myDict.get('custom_field%s' % field) 
    if new_field is not None: 
     customItem.append(new_field) 

for field in customItem: 
     if field.get('label') == 'foo' and field.get('data') != '': 
      for part in field.get('data').split(): 
       """do something for each""" 
for field in customItem: 
     if field.get('label') == 'bar' and field.get('data') != '': 
      print (field.get('data')) 

我的總體目標是爲客戶創造一個自動化的ssh_config文件,所以用一個字典爲主機,它會創建幾個ssh_config中的條目,結果應該像這樣的:

hostname (from label 'name') 
    ProxyCommand ssh -q [email protected] nc -q0 %h 22 
hostname-fwd (twice, because there was data behind label 'LocalForward') 
    ProxyCommand ssh -q [email protected] nc -q0 %h 22 
    LocalForward 8080:localhost:80 
bar1 (as found from label 'CNAMEs') 
    ProxyCommand ssh -q [email protected] nc -q0 %h 22 
bar1-fwd (twice, just because there was data behind label 'bar') 
    ProxyCommand ssh -q [email protected] nc -q0 %h 22 
    LocalForward 8080:localhost:80 
bar2 (same as with bar1) 
    ProxyCommand ssh -q [email protected] nc -q0 %h 22 
bar2-fwd 
    ProxyCommand ssh -q [email protected] nc -q0 %h 22 
    LocalForward 8080:localhost:80 

編輯我想更具體與我現在的任務,因爲只是隨機的sampleData不是那麼容易理解,不好意思。

+2

您的問題的第二部分是非常不清楚,但似乎是一個單獨的問題,從你在第一部分提出的問題。請分別提問每個問題! – taleinat

+1

@Andreas Hubert你的問題的第二部分需要更多的信息來回答。也許你可以嘗試將兩者結合成一個問題 – Obsidian

+0

如果您試圖通過記錄中的不同字段對記錄進行索引,您可能需要使用適當的關係數據庫。對於小數據集,只需使用[sqlite3'模塊](https://docs.python.org/3/library/sqlite3.html)就可以工作(而且你甚至不需要真正的磁盤數據庫;'sqlite3'通過連接到「」:memory:「'」支持瞬態數據的內存數據庫。 – ShadowRanger

回答

1

您可以通過標籤將字段編入索引,即創建一個新的字典用於快速查找標籤。例如:

>>> label2field = { 
    field_val['label']: field_key 
    for field_key, field_val in myDict.items() 
} 

>>> label2field['more'] 
'custom_field4' 

>>> myDict[label2field ['foo']]['data'] 
'bar1 bar2' 

編輯:支持None值和字符串myDict,在創建索引時只篩選出來:

label2field = { 
    field_val['label']: field_key 
    for field_key, field_val in myDict.items() 
    if isinstance(field_val, dict) 
} 
+0

如果你的解決方案能夠像你寫的那樣工作,那將是完美的!但我用你的label2field得到這個:>>> label2field = { ... field_val ['label']:field_key ... for field_key,field_val in myDict.items() ...} 回溯(最近通話最後一個): 文件「」,3號線,在 文件「」,3號線,在 類型錯誤:「NoneType」對象未標化的 –

+0

它的SOOOO貼近我的完美解決方案!請給我一個提示!隨着示例字典的作品,但我的字典也有其他的字跡,沒有「標籤」。例如myDict = {'custom_field1':{'label':'foo','data':'bar1 bar2'}, 'anotherField'= {'user':'foo','name':'bar'}}謝謝! –

+1

所以只是過濾掉那些... – taleinat

0

既然你只使用值,你可以試試這

for value in myDict.values(): 
    #Do a common check for data having usable information 
    if isinstance(value, dict) and value['data']: 

     if value['label'] == 'foo': 
      for part in value['data'].split(): 
       #For foo parts 
       print(part) 

     elif value['label'] == 'bar': 
      for part in value['data'].split(): 
       #For bar parts 
       print(part) 

     #Add more elif label checks if needed