Python - 格式化一个大字符串

标签 python string formatting

我有一长串农场动物,看起来像这样:农场动物前面有\n\n\n 和\t

                Farm Animals

                    F

                    M

                Total




Cow


                        11

                        10


                        21





Horse


                        3

                        6


                        9





Sheep


                        4

                        8


                        12





Goat


                        3

                        4


                        7





Chicken


                        1

                        1


                        2





Hen


                        5

                        7


                        12





Pig


                        3

                        7


                        10





Turkey


                        0

                        5


                        5





Cattle


                        1

                        1


                        2





Llama


                        3

                        5


                        8





Donkey


                        5

                        9


                        14





Duck


                        1

                        1


                        2




Total


                    40

                    64

104

我想让输出看起来像这样:

              Farm Animals     F     M    Total
                       Cow    11    12       23
                     Horse     5     5       10
                     Sheep     4    12       16
                                        .......
                     Total   108   134      242

到目前为止我所做的是

print(farmAnimalsString.strip().replace('\n\n','').replace('\t',' ').replace('\n\n\n','').replace('\n\n\n\n',''))

我当前的解决方案不一定会产生正确的输出,但已经很接近了。每个字段之间有不同数量的 \n ,这对我来说很棘手。所以,我想知道是否有更好的方法来做到这一点,因为我所能想到的就是这种蛮力方式,而且我认为这样做我将无法获得我想要的输出。 提前致谢!

编辑:我刚刚意识到其中一个动物名称是两个单词,例如“Jack Rabbit” 所以当它打印出来时,它看起来像

Farm Animals F            M        Total       Jack
Rabbit       1            2           3        Snow
Bunny        0            1           1         Cow
0            1            1        Total          1
4            5

最佳答案

如果您需要识别名称超过一个单词的动物,那就有点棘手了。但是,如果我们利用所有剩余字段都是数字的事实,我们可以通过使用它来区分情况。以下代码正是这样做的:

words = animal_str.split()[5:]
headers = ['Farm Animals', 'F', 'M', 'Total']
fields = []

it = iter(words)
try:
    while True:
        row = []
        animal = []
        while True:
            n = next(it)
            try:
                x = int(n)
                row.append(' '.join(animal))
                row.append(x)
                break
            except ValueError:
                animal.append(n)

        row.append(int(next(it)))
        row.append(int(next(it)))
        fields.append(row)
except StopIteration:
    pass

每个外部 while 循环生成一行并将结果存储到字段中。


关于如何生成表格输出。如果将工作委托(delegate)给一些现有的库,例如 tabulate: https://pypi.python.org/pypi/tabulate 会容易得多。

效果演示如下:

In [9]: import tabulate

In [16]: fields
Out[16]: 
[['Cow', 11, 10, 21],
 ['Horse', 3, 6, 9],
 ['Sheep', 4, 8, 12],
 ['Goat', 3, 4, 7],
 ['Chicken', 1, 1, 2],
 ['Hen', 5, 7, 12],
 ['Pig', 3, 7, 10],
 ['Turkey', 0, 5, 5],
 ['Cattle', 1, 1, 2],
 ['Llama', 3, 5, 8],
 ['Donkey', 5, 9, 14],
 ['Duck', 1, 1, 2],
 ['Jack Rabbit', 1, 2, 3],
 ['Total', 40, 64, 104]]

In [18]: print tabulate.tabulate(fields, headers=headers, tablefmt='plain', stralign='right')
  Farm Animals    F    M    Total
           Cow   11   10       21
         Horse    3    6        9
         Sheep    4    8       12
          Goat    3    4        7
       Chicken    1    1        2
           Hen    5    7       12
           Pig    3    7       10
        Turkey    0    5        5
        Cattle    1    1        2
         Llama    3    5        8
        Donkey    5    9       14
          Duck    1    1        2
   Jack Rabbit    1    2        3
         Total   40   64      104

这应该可以满足您的要求。

关于Python - 格式化一个大字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48977541/

相关文章:

python - Tensorflow Metal 插件已注册错误

Mysql 子字符串使用 instr()

regex - 在 Perl 中的变量中用反斜杠替换文本

Python,格式化这个列表

mysql - 我如何过滤掉最新的运行并将行交叉制表到列中?

python - 将 GPU 与 opencv-python 结合使用

python 用类写一个装饰器

c# - 为什么 Regex.Split 在正则表达式上拆分时保留分隔符

language-agnostic - 什么是普遍接受的代码格式指南?

java - 从显示 OutOfMemoryError : Java heap space 的 Pyspark 数据框创建字典