如何以固定宽度打印字符串?
- 2024-12-31 08:37:00
- admin 原创
- 52
问题描述:
我有以下代码(打印字符串中所有排列的出现):
def splitter(str):
for i in range(1, len(str)):
start = str[0:i]
end = str[i:]
yield (start, end)
for split in splitter(end):
result = [start]
result.extend(split)
yield result
el =[]
string = "abcd"
for b in splitter(string):
el.extend(b)
unique = sorted(set(el))
for prefix in unique:
if prefix != "":
print "value " , prefix , "- num of occurrences = " , string.count(str(prefix))
但是当我打印结果时,由于值的长度并不完全相同,所以它们没有排列整齐:
value a - num of occurrences = 1
value ab - num of occurrences = 1
value abc - num of occurrences = 1
value b - num of occurrences = 1
value bc - num of occurrences = 1
value bcd - num of occurrences = 1
value c - num of occurrences = 1
value cd - num of occurrences = 1
value d - num of occurrences = 1
如何使用format
或 f 字符串使输出排列成直列?
解决方案 1:
我发现使用str.format
更优雅:
>>> '{0: <5}'.format('s')
's '
>>> '{0: <5}'.format('ss')
'ss '
>>> '{0: <5}'.format('sss')
'sss '
>>> '{0: <5}'.format('ssss')
'ssss '
>>> '{0: <5}'.format('sssss')
'sssss'
如果您想要将字符串与右侧对齐,>
请使用<
:
>>> '{0: >5}'.format('ss')
' ss'
编辑 1:正如评论中提到的:0
in'{0: <5}'
表示传递给的参数的索引str.format()
。
编辑2:在python3中也可以使用f字符串:
sub_str='s'
for i in range(1,6):
s = sub_str*i
print(f'{s:>5}')
' s'
' ss'
' sss'
' ssss'
'sssss'
或者:
for i in range(1,5):
s = sub_str*i
print(f'{s:<5}')
's '
'ss '
'sss '
'ssss '
'sssss'
值得注意的是,在上面一些地方,' '
添加了(单引号)来强调打印字符串的宽度。
解决方案 2:
编辑 2013-12-11 - 这个答案很旧了。它仍然有效且正确,但查看此答案的人应该更喜欢新的格式语法。
您可以使用如下字符串格式:
>>> print '%5s' % 'aa'
aa
>>> print '%5s' % 'aaa'
aaa
>>> print '%5s' % 'aaaa'
aaaa
>>> print '%5s' % 'aaaaa'
aaaaa
基本上:
该
%
字符通知 Python 它必须用某些东西替代标记该
s
字符通知 python 该标记将是一个字符串(或任何您希望的数字
5
)通知 python 用空格填充字符串,最多 5 个字符。
在您的具体情况下,可能的实现可能如下所示:
>>> dict_ = {'a': 1, 'ab': 1, 'abc': 1}
>>> for item in dict_.items():
... print 'value %3s - num of occurances = %d' % item # %d is the token of integers
...
value a - num of occurances = 1
value ab - num of occurances = 1
value abc - num of occurances = 1
附注:我只是想知道您是否知道itertools
模块的存在。例如,您可以使用以下代码在一行中获取所有组合的列表:
>>> [''.join(perm) for i in range(1, len(s)) for perm in it.permutations(s, i)]
['a', 'b', 'c', 'd', 'ab', 'ac', 'ad', 'ba', 'bc', 'bd', 'ca', 'cb', 'cd', 'da', 'db', 'dc', 'abc', 'abd', 'acb', 'acd', 'adb', 'adc', 'bac', 'bad', 'bca', 'bcd', 'bda', 'bdc', 'cab', 'cad', 'cba', 'cbd', 'cda', 'cdb', 'dab', 'dac', 'dba', 'dbc', 'dca', 'dcb']
combinations
并且您可以通过与 结合使用来获取出现的次数count()
。
解决方案 3:
最初发布为对@0x90 答案的编辑,但由于偏离帖子的初衷而被拒绝,并建议作为评论或答案发布,因此我在这里附上简短的文字说明。
除了@0x90 的答案之外,还可以通过使用宽度变量使语法更加灵活(根据@user2763554 的评论):
width=10
'{0: <{width}}'.format('sss', width=width)
此外,您可以通过仅使用数字并依赖于传递给的参数的顺序来使该表达式更简洁format
:
width=10
'{0: <{1}}'.format('sss', width)
或者甚至省略所有数字,以实现最大的、可能非 Python 隐式的紧凑性:
width=10
'{: <{}}'.format('sss', width)
更新 2017-05-26
随着Python 3.6 中格式化字符串文字(简称“f 字符串”)的引入,现在可以使用更简洁的语法访问以前定义的变量:
>>> name = "Fred"
>>> f"He said his name is {name}."
'He said his name is Fred.'
这也适用于字符串格式
>>> width=10
>>> string = 'sss'
>>> f'{string: <{width}}'
'sss '
解决方案 4:
format
绝对是最优雅的方式,但据我所知你不能将它与 python 的logging
模块一起使用,因此你可以使用以下格式来实现%
:
formatter = logging.Formatter(
fmt='%(asctime)s | %(name)-20s | %(levelname)-10s | %(message)s',
)
这里的-
表示左对齐,前面的数字s
表示固定宽度。
一些示例输出:
2017-03-14 14:43:42,581 | this-app | INFO | running main
2017-03-14 14:43:42,581 | this-app.aux | DEBUG | 5 is an int!
2017-03-14 14:43:42,581 | this-app.aux | INFO | hello
2017-03-14 14:43:42,581 | this-app | ERROR | failed running main
更多信息请参阅此处的文档:https://docs.python.org/2/library/stdtypes.html#string-formatting-operations
解决方案 5:
当您想在一个打印语句中打印多个元素时,这将有助于保持固定的长度。
25s
格式化一个包含 25 个空格的字符串,默认左对齐。
5d
格式化一个保留 5 个空格的整数,默认右对齐。
members=["Niroshan","Brayan","Kate"]
print("__________________________________________________________________")
print('{:25s} {:32s} {:35s} '.format("Name","Country","Age"))
print("__________________________________________________________________")
print('{:25s} {:30s} {:5d} '.format(members[0],"Srilanka",20))
print('{:25s} {:30s} {:5d} '.format(members[1],"Australia",25))
print('{:25s} {:30s} {:5d} '.format(members[2],"England",30))
print("__________________________________________________________________")
这将打印
__________________________________________________________________
Name Country Age
__________________________________________________________________
Niroshan Srilanka 20
Brayan Australia 25
Kate England 30
__________________________________________________________________
解决方案 6:
>>> print(f"{'123':<4}56789")
123 56789
解决方案 7:
我发现ljust()
以rjust()
固定宽度打印字符串或用空格填充 Python 字符串非常有用。
一个例子
print('123.00'.rjust(9))
print('123456.89'.rjust(9))
# expected output
123.00
123456.89
对于您的情况,您可以使用fstring
打印
for prefix in unique:
if prefix != "":
print(f"value {prefix.ljust(3)} - num of occurrences = {string.count(str(prefix))}")
预期输出
value a - num of occurrences = 1
value ab - num of occurrences = 1
value abc - num of occurrences = 1
value b - num of occurrences = 1
value bc - num of occurrences = 1
value bcd - num of occurrences = 1
value c - num of occurrences = 1
value cd - num of occurrences = 1
value d - num of occurrences = 1
您可以更改3
为排列字符串的最大长度。
解决方案 8:
使用 f 字符串与使用格式一样有效:
https://scientificallysound.org/2016/10/17/python-print3/
f'{some_varaible:<20s}{some_varaible:_<20s}{some_varaible:.<20s}'
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理必备:盘点2024年13款好用的项目管理软件