Операции форматирования строки Python - PullRequest
0 голосов
/ 05 августа 2009

Код неисправности:

pos_1 = 234
pos_n = 12890
min_width = len(str(pos_n)) # is there a better way for this?

# How can I use min_width as the minimal width of the two conversion specifiers?
# I don't understand the Python documentation on this :(
raw_str = '... from %(pos1)0*d to %(posn)0*d ...' % {'pos1':pos_1, 'posn': pos_n}

Требуемый вывод:

... from 00234 to 12890 ...

           ______________________EDIT______________________

Новый код:

# I changed my code according the second answer
pos_1 = 10234 # can be any value between 1 and pos_n
pos_n = 12890
min_width = len(str(pos_n))

raw_str = '... from % *d to % *d ...' % (min_width, pos_1, min_width, pos_n)

Новая проблема:

Существует один дополнительный пробел (я пометил его _ ) перед целочисленными значениями для инициаторов с min_width цифрами:

print raw_str
... from _10234 to _12890 ...

Кроме того, мне интересно, есть ли способ добавить ключи сопоставления?

Ответы [ 3 ]

2 голосов
/ 05 августа 2009
pos_1 = 234
pos_n = 12890
min_width = len(str(pos_n))

raw_str = '... from %0*d to %0*d ...' % (min_width, pos_1, min_width, pos_n)
1 голос
/ 05 августа 2009

Относительно использования типа отображения в качестве второго аргумента для '%':

Полагаю, вы имеете в виду нечто подобное '% (mykey) d'% {'mykey': 3} , верно ?! Я думаю, что вы не можете использовать это, если вы используете синтаксис "% * d", так как нет способа обеспечить необходимые аргументы ширины с помощью dict.

Но почему бы вам не сгенерировать строку формата динамически:

fmt = '... from %%%dd to %%%dd ...' % (min_width, min_width)
# assuming min_width is e.g. 7 fmt would be: '... from %7d to %7d ...'
raw_string = fmt % pos_values_as_tuple_or_dict

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

1 голос
/ 05 августа 2009
"1234".rjust(13,"0")

Должен делать то, что вам нужно

дополнение:

a = ["123", "12"]    
max_width = sorted([len(i) for i in a])[-1]

поместите max_width вместо 13 выше и поместите все ваши строки в один массив a (который мне кажется гораздо более удобным, чем стек переменных).

дополнительная неприятность: (Используя массив чисел, чтобы приблизиться к вашему вопросу.)

a = [123, 33, 0 ,223]
[str(x).rjust(sorted([len(str(i)) for i in a])[-1],"0") for x in a]

Кто сказал, что Perl - единственный язык, на котором легко генерировать мозговые дампы? Если регулярные выражения являются крестным отцом сложного кода, то понимание списков является крестной матерью.

(Я относительно новичок в python и довольно уверен, что где-то в массивах должна быть max-функция, которая снизила бы сложность. Хорошо, проверено, есть. )

[str(x).rjust(max([len(str(i) for i in a]),"0") for x in a]

И, пожалуйста, обратите внимание на комментарии ниже «не помещать вычисление инварианта (максимального значения) в понимание внешнего списка».

...