我正在编写一个小脚本,它应该格式化一些字符串,以便它们更具可读性。输入是列表中包含字符串的列表。输入可能如下所示(注意:这与图像中的输入相同,只是图像更好地对比输入和输出):
['last name: Callum', 'first name: Brian', 'middle name: Mosbey', 'balance: $0']
每个字符串中都有一个:
。我希望:
的所有文本都以相同的宽度打印,以便更容易阅读信息。我想要的输出是这样的(注意:我使用方法2,但不使用方法1):
['last name: Callum', 'first name: Brian', 'middle name: Mosbey', 'balance: $0']
以下是解决问题的方法:
首先,我们遍历字符串列表并在另一个列表中存储:
可以找到的索引
首先我们找出哪个字符串包含highest_index
的{{1}}
我们再次遍历字符串列表(新迭代),我们计算当前:
索引的difference
与:
(仍然在迭代中)我们找到highest_index
的位置右侧我们插入:
* ' '
CODE:
difference
答案 0 :(得分:3)
insert
列表方法就行了(改变列表,但不返回它)并返回None
:
>>> a = [1,2,3]
>>> b = a.insert(1, "inserted")
>>> print a
[1, 'inserted', 2, 3]
>>> print b
None
因此,您无法将涉及.insert
的操作链接起来,这就是
''.join(list(s).insert(index_colon[index]+1, ' '*difference))
不起作用。这基本上是''.join(None)
。
您的第二种方法有效,因为您正在调用insert
但不会尝试处理它返回的内容。
答案 1 :(得分:2)
而不是解决你的错误(@DSM做得很好),知道你可以通过使用以下方式在python中轻松地进行垂直对齐:
这是最简单的方法,但可能无法扩展到很长的左侧字符串
>>> test = ['last name: Callum', 'first name: Brian', 'middle name: Mosbey', 'balance: $0']
>>> for s in test:
>>> print s.replace(': ', ':\t').expandtabs(8)
last name: Callum
first name: Brian
middle name: Mosbey
balance: $0
N.B。:您可以根据对齐是否正确来更改expandtabs的值。
这有点复杂,但是使用长左手边的琴弦可以很好地缩放
>>> test = ['last name: Callum', 'first name: Brian', 'middle name: Mosbey', 'balance: $0']
>>> longest = reduce(lambda x, y: max(x, len(y.split(': ')[0])+2), test, 0)
for s in test:
l, r = s.split(': ')
print "{:<{longest}} {}".format(l+':',r,longest=longest)
有关详情,请参阅string formats文档。
我也认为@ phil-cooper计算longest
的解决方案比我的聪明:
longest = max(s.index(':') for s in test)
你应该使用他的解决方案(但仍然添加2
,:
永远不会计入他或我的解决方案中)。
最后,您看起来不了解list comprehension:
strings = ["{:<{longest}} {}".format(l+':',r,longest=longest) for l,r in [s.split(': ') for s in test]]
所以,我希望这有帮助,即使我不是直接通过给你其他选项回答你的问题; - )
答案 2 :(得分:1)
您只需要三个元素
最大len:
all_strs = ['last name: Callum', 'first name: Brian', 'middle name: Mosbey', 'balance: $0']
maxlen = max(s.index(':') for s in all_strs)
正确的格式字符串:
fmt = "%%-%is:%%s" % maxlen # this resolves to '%-11s:%s' in your case
你的最终结果:
[fmt % tuple(s.split(':',1)) for s in all_strs]
修改强> 使用格式格式化:
fmt = "{{:{}}}:{{}}".format(maxlen) # resolves to '{:11}:{}'
[fmt.format(*s.split(':',1)) for s in all_strs]
说明:(OP请求)方法是动态创建格式字符串。这需要奇怪的看起来加倍像%{}
这样的字符。因此奇怪的"{{:{}}}:{{}}"
只是努力以“普通”格式字符串结束。与第一个示例中的“%%”类似的问题
之后,只需将每个字符串拆分为两个并用构造的格式sting重新组合。
希望有所帮助。
在python中,与c和其他语言不同,strings are immutable objects,而不是字符列表。这就是为什么你的第一种方法不起作用的本质。