以相同的宽度打印“:”的所有内容

时间:2014-02-01 15:13:28

标签: python python-2.7

我正在编写一个小脚本,它应该格式化一些字符串,以便它们更具可读性。输入是列表中包含字符串的列表。输入可能如下所示(注意:这与图像中的输入相同,只是图像更好地对比输入和输出):

['last name: Callum', 'first name: Brian', 'middle name: Mosbey', 'balance: $0']

每个字符串中都有一个:。我希望:的所有文本都以相同的宽度打印,以便更容易阅读信息。我想要的输出是这样的(注意:我使用方法2,但不使用方法1):

['last name:   Callum', 'first name:  Brian', 'middle name: Mosbey', 'balance:     $0']

以下是解决问题的方法:

  1. 首先,我们遍历字符串列表并在另一个列表中存储:可以找到的索引

  2. 首先我们找出哪个字符串包含highest_index的{​​{1}}

  3. 我们再次遍历字符串列表(新迭代),我们计算当前:索引的difference:

    的索引
  4. (仍然在迭代中)我们找到highest_index的位置右侧我们插入: * ' '

  5. 问题:我有2个此解决方案的实现。方法1较短,但不起作用。方法2较长但可以使用。为什么方法1不起作用?

    enter image description here


    CODE:

    difference

    pastebin

3 个答案:

答案 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,而不是字符列表。这就是为什么你的第一种方法不起作用的本质。