Довольно распечатать несколько пар ключ-значение с указанной шириной - PullRequest
0 голосов
/ 28 июня 2018

У меня следующая структура, и я хочу записать ее в файл с заданной шириной, и, что интересно, я не смог заставить ее работать.

{'c': {' eva X': -15,
       'Cki Xi': -2,
       'I Xalt': -23,
       'Ik Xip': -8,
       'Ir 1 X': -19,
       'Xamdal': 20,
       'Xincik': 11,
       'bu aXa': -1,
       'elinde Xop': -24,
       'gol aX': 5,
       'huyu X': -6,
       'ie Xol': -14,
       'im teX': -16,
       'k Xipl': 18,
       'kriz X': 17,
       'm Xars': 7,
       'mUS aX': -13,
       'mem Xi': -21,
       'na Xog': 3,
       'ncu X ': 9,
       'ram Xo': 4,
       'tI Xat': 22,
       'vre aX': 12,
       'zay Xo': 10}}

Результат должен выглядеть следующим образом (ps: порядок может отличаться)

{'c': {"bu aXa": -1, "Cki Xi": -2, "na Xog": 3,
       "ram Xo": 4, "gol aX": 5, "huyu X": -6,
       "m Xars": 7, "Ik Xip": -8, "ncu X ": 9,
       "zay Xo": 10, "Xincik": 11, "vre aX": 12,
       "mUS aX": -13, "ie Xol": -14, " eva X": -15,
       "im teX": -16, "kriz X": 17, "k Xipl": 18,
       "Ir 1 X": -19, "Xamdal": 20, "mem Xi": -21,
       "tI Xat": 22, "I Xalt": -23, "elinde Xop": -24}}

Я пробовал pprint следующим образом, но безрезультатно. Я не могу получить желаемый результат.

import pprint

pprint.pprint(data, width=100)
pprint.pprint(data, width=200)
pprint.pprint(data, width=300)
# {'c': {' eva X': -15,
#        'Cki Xi': -2,
#        'I Xalt': -23,
#        'Ik Xip': -8,
#        'Ir 1 X': -19,
#        'Xamdal': 20...  (all of them same as above)

Ответы [ 3 ]

0 голосов
/ 29 июня 2018

Вот мое предлагаемое решение с использованием чистого Python. Комментарии включены, чтобы помочь понять мою логику:

indict = {'c': {' eva X': -15,
       'Cki Xi': -2,
       'I Xalt': -23,
       'Ik Xip': -8,
       'Ir 1 X': -19,
       'Xamdal': 20,
       'Xincik': 11,
       'bu aXa': -1,
       'elinde Xop': -24,
       'gol aX': 5,
       'huyu X': -6,
       'ie Xol': -14,
       'im teX': -16,
       'k Xipl': 18,
       'kriz X': 17,
       'm Xars': 7,
       'mUS aX': -13,
       'mem Xi': -21,
       'na Xog': 3,
       'ncu X ': 9,
       'ram Xo': 4,
       'tI Xat': 22,
       'vre aX': 12,
       'zay Xo': 10}}

#Create a string from dict.
dictString = str(indict)

#Set the number of elements you want for each row.
elements = 3

#Split the string to individual records of dict.
dictString = dictString.split(',')

#Add ' ,' to the end.
newString = list(map(lambda i: i+" ,", dictString[:-1]))
newString.append(dictString[-1])

#Find the position of the dict 'opening' bracket in order to be used as padding point.
pos = newString[0].find(": {") + 2
print(pos)

#Form row with number of elements defined by the 'elements' variable.
newString = ["".join(newString[i:i+elements]) for i in range(0,len(newString),elements)]

#Pad each row to match with the padding point.
newString = [newString[0]] + [i.rjust(len(i) + pos,' ') for i in newString[1:]]

#Create a final string, appending all rows.
finalString = "\n".join(newString)
print(finalString)

#Write the string to file.
with open("output.txt", "w") as outFile:
       outFile.write(finalString)

Вывод из print(finalString):

{'c': {' eva X': -15 , 'Cki Xi': -2 , 'I Xalt': -23 ,
       'Ik Xip': -8 , 'Ir 1 X': -19 , 'Xamdal': 20 ,
       'Xincik': 11 , 'bu aXa': -1 , 'elinde Xop': -24 ,
       'gol aX': 5 , 'huyu X': -6 , 'ie Xol': -14 ,
       'im teX': -16 , 'k Xipl': 18 , 'kriz X': 17 ,
       'm Xars': 7 , 'mUS aX': -13 , 'mem Xi': -21 ,
       'na Xog': 3 , 'ncu X ': 9 , 'ram Xo': 4 ,
       'tI Xat': 22 , 'vre aX': 12 , 'zay Xo': 10}}

То же самое относится и к содержимому файла.

0 голосов
/ 29 июня 2018

Вот решение, которое я написал для моей собственной проблемы с небольшими изменениями в соответствии с моими потребностями. Тем не менее я открыт для идей. Было бы лучше, если бы pprint охватил этот случай, к сожалению.

def prettyPrint(myDict, itemPerLine=3):
    myStr = '{'
    for k1, v1 in myDict.items():
        myStr += "'" + k1 + "': {"
        itemCount = 0
        for k2, v2 in v1.items():
            myStr += '"' + str(k2) + '": ' + str(v2) + ', '
            if itemCount == itemPerLine:
                myStr += '\n' + ' ' * 32
                itemCount = 0
            itemCount += 1
        myStr = myStr[:-2] + "},\n" + ' ' * 26
    return myStr[:-2] + "}"

prettyPrint(data)
{'c': {"bu aXa": -1, "Cki Xi": -2, "na Xog": 3,
       "ram Xo": 4, "gol aX": 5, "huyu X": -6,
       "m Xars": 7, "Ik Xip": -8, "ncu X ": 9,
       "zay Xo": 10, "Xincik": 11, "vre aX": 12,
       "mUS aX": -13, "ie Xol": -14, " eva X": -15,
       "im teX": -16, "kriz X": 17, "k Xipl": 18,
       "Ir 1 X": -19, "Xamdal": 20, "mem Xi": -21,
       "tI Xat": 22, "I Xalt": -23, "elinde Xop": -24}}
0 голосов
/ 28 июня 2018

В документации pprint сказано -

Желаемая ширина вывода ограничена с помощью параметра ширины; по умолчанию это 80 символов. Если структура не может быть отформатирована в пределах ограниченной ширины, будут приложены все усилия. Если для параметра compact задано значение false (по умолчанию), каждый элемент длинной последовательности будет отформатирован в отдельной строке. Если для параметра compact задано значение true, в каждой строке вывода будет отформатировано столько элементов, сколько уместится в ширину.

Таким образом, вы можете использовать параметр compact=True для желаемого выхода. Но вам нужно найти приблизительную ширину для сжатия трех ключевых: значение в одну строку, как вы ожидали.

...