5

pformat()辞書を文字列に変換するために使用する関数があります(無関係:文字列は後でファイルに挿入されwrite()ます.py)。

したがってMY_DCT = {1: 11, 2: 22, 3: 33}、次のような文字列になります。

MY_DCT = {
    1: 11,
    2: 22,
    3: 33}

関数には 2 つの要件があります。

  1. 辞書項目は、最初の行の後に表示する必要があります。
  2. 要素は 4 つの空白でインデントする必要があります。

関数は次のとおりです。

import pprint    

def f(obj_name, obj_body_as_dct):

    body = '{\n' + pprint.pformat(obj_body_as_dct, indent=4, width=1)[1:]
    name_and_equal_sign = obj_name + ' = '

    return name_and_equal_sign + body + '\n\n'


d = {1: 11, 2: 22, 3: 33}

print(f('MY_DCT', d))

indent=0この文字列を取得した場合:

MY_DCT = {
1: 11,
2: 22,
3: 33}

indent=4この文字列を取得した場合:

MY_DCT = {
   1: 11,
    2: 22,
    3: 33}

パラメータを確認しましたpformat()が、正しい数の空白を各行に表示する方法がわかりませんでした。

replace()などを使用して文字列を修正できることはわかって+' 'いますが、余分な空白がどこから来ているのか、パラメータを正しく設定することでそれを取り除くことができるかどうか疑問に思っています (それが可能であれば、それはそうです)。

注:上記を達成するためのより良い方法がある場合は、お知らせください。

4

3 に答える 3

5

indentinのデフォルト値pformatは 1 で、キーが上下に表示されます。

たとえば、次のpformat(d, indent=0, width=1)文字列になります。

{1: 11,
2: 22,
3: 33}

indent=1:

{1: 11,
 2: 22,
 3: 33}

indent=2:

{ 1: 11,
  2: 22,
  3: 33}

常に最初の行の空白を 1 つ減らします。


目標は最初の行の後に dict 要素を表示し、すべての要素を 4 つのスペースでインデントすることだったので、最初の要素の前に単一の空白を追加して使用indent=4すると、一部の辞書で機能します (@logic で提案されているように)。

ただし、次のようなd = {1: {'a': 1, 'b': 2}, 2: 22, 3: 33}dictindentは、深さが 1 より大きい dict の外観にも影響するため、見栄えが悪くなります。

MY_DCT = {
    1: {   'a': 1,
           'b': 2},
    #    ^
    #    |
    # ugly
    2: 22,
    3: 33}

最も魅力的な解決策 (私が取り組んでいるデータの場合) はindent=1、最初の要素に 3 つの空白を保持して追加し、残りの要素に 4 つの空白を追加することです。

def f(obj_name, given_dct):
    """
    Converts given dct (body) to a pretty formatted string.
    Resulting string used for file writing.

    Args:
        obj_name: (str) name of the dict
    Returns:
        (str)
    """

    string = pp.pformat(given_dct, width=1)[1:]

    new_str = ''
    for num, line in enumerate(string.split('\n')):
        if num == 0:
            # (pprint module always inserts one less whitespace for first line)
            # (indent=1 is default, giving everything one extra whitespace)
            new_str += ' '*4 + line + '\n'
        else:
            new_str += ' '*3 + line + '\n'

    return obj_name + ' = {\n' + new_str


s = f(obj_name='MY_DCT', given_dct=d)

次の文字列が生成されます。

MY_DCT = {
    1: {'a': 'aa',
        'b': [1,
              2,
              3]},
    2: 22,
    3: 33}
于 2015-04-06T10:20:56.987 に答える
0

ロジックの回答では、インデントの問題が発生している理由について説明しています。ただし、 (IMO)より簡潔なアプローチとして、を利用できますjson。この出力は、要素がディクショナリ要素を意味する仮定しています。

import json
obj_name = 'MY_DCT = '
obj_body_as_dct = {1: 11, 2: 22, 3: 33}

stringy = "\"\"\"" + obj_name + "{" \
          + str(json.dumps(obj_body_as_dct, indent=4, separators=(',', ': ')))[1:] + "\"\"\""
print(stringy)

出力:

"""MY_DCT = {
    "1": 11,
    "2": 22,
    "3": 33
}"""
于 2015-04-01T18:31:55.510 に答える