将Python嵌套字典转换为reStructuredText条目列表

3

我有这个字典:

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

我阅读了这篇文章,但我无法将其翻译成项目符号列表。
感谢大家。

你尝试过使用模板管理器吗?另一个(相关的)问题:深度(嵌套层数)可能是无限的吗? - gunzapper
4个回答

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

谢谢你的解决方案,它很棒并且运行良好。为了保存文件,我只需添加:f = open("path_to_rst", 'w') 并将 print 替换为 f.write。我遇到了缩进和空白行的小问题。即使在每个 {} 后面添加 \n,输出文件也不包含空行(如问题所述)。这可能会成为未来 rst2.... 命令的问题。 - matteo
通过在代码中添加自定义的 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的较早版本中,字典的顺序是不保证有序的。


好的,我会尝试管理这个函数并将其适应于代码。谢谢! - matteo

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]))

0
我会将任务分为三个步骤:-
1- 对字典进行排序 - 由于这是不可能的,最好创建一个键列表,对该列表进行排序,然后迭代遍历它们
2- 检查票是否存在,如果存在,则打印票中的每个项目
3- 检查注释是否存在,然后打印每个注释项。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接