2017-01-19 71 views
3

我有這個詞典:Python中的嵌套字典reStructuredText的項目列表

d = {'B': {'ticket': ['two', 'three'], 'note': ['nothing to report']}, 'A': {'ticket': ['one'], 'note': ['my note']}, 'C': {'ticket': ['four'], 'note': ['none']}} 

,我試圖將其轉換成.rst文件作爲子彈列表,如:

* A 

    * ticket: 

    * one 

    * note 

    * my note 

* B 

    * ticket: 

    * two 
    * three 

    * note: 

    * nothing to report 

* C 

    * ticket: 

    * four 

    * note: 

    * none 

我閱讀this approach但我不能翻譯成一個符號列表

感謝所有

+0

你嘗試用模板經理?另一個(相關)問題:可能是深度(嵌套等級)無限? – gunzapper

回答

3

對於一些喜歡你的具體例子,你看這個:

>>> for key, value in d.items(): 
... print('* {}'.format(key)) 
... for k, v in value.items(): 
...  print(' * {}:'.format(k)) 
...  for i in v: 
...   print(' * {}'.format(i)) 
... 
* B 
* note: 
    * nothing to report 
* ticket: 
    * two 
    * three 
* A 
* note: 
    * my note 
* ticket: 
    * one 
* C 
* note: 
    * none 
* ticket: 
    * four 
+0

謝謝你的解決方案是偉大的,它工作正常。爲了保存我剛剛添加的文件:'f = open(「path_to_rst」,'w')'並用'f.write'替換了'print'。我有一個縮進和空行的小問題。即使我在每個「{}」後面添加'\ n',輸出文件也不包含空行(如問題所示)。這可能是未來'rst2 ....'命令 – matteo

+0

通過在代碼中添加自定義的f.write(「\ n」)行來解決的問題。再次感謝! – matteo

1

更少通用的解決方案,您的問題將是一個遞歸函數:

def bullet_list(elements, level=0, indent_size=4): 
    try: 
     items = elements.items() 
    except AttributeError: 
     for bullet_point in elements: 
      yield '{}* {}'.format(' ' * (indent_size * level), bullet_point) 
    else: 
     for bullet_point, sub_points in items: 
      yield '{}* {}'.format(' ' * (indent_size * level), bullet_point) 
      yield from bullet_list(sub_points, level=level + 1, indent_size=indent_size) 

for line in bullet_list(d): 
    print(line) 

輸出:

* A 
    * note 
     * my note 
    * ticket 
     * one 
* C 
    * note 
     * none 
    * ticket 
     * four 
* B 
    * note 
     * nothing to report 
    * ticket 
     * two 
     * three 

但是請注意,直到最新版本的python才能保證字典中的順序。

+0

太好了。我將嘗試管理這個函數並使其適應代碼。謝謝! – matteo

0

我就拉下把任務分成三個步驟: -

1 - 排序字典 - 因爲這是不可能的,將是最好創建密鑰列表,排序該列表,然後遍歷它們

2 - 檢查票證是否存在,票證中是否有打印物品

3 - 檢查是否存在票據,然後打印每個物品的票據。

1

醜陋和骯髒

def bullet(d, depth=1): 
    for k,v in d.items(): 
     print(''.join([depth * ' ', '* ', k])) 
     if isinstance(v, dict): 
      bullet(v, depth+1) 
     else: 
      for e in v: 
       print(''.join([depth * ' ', ' * ', e]))