如何使用textwrap在列中打印列表?

时间:2018-06-14 13:10:45

标签: python-3.x

我有一个包含产品信息的词典列表。 我想打印列中的每个值以及超出列长度的textwrap值。

这是我到目前为止所看到的,似乎str.format()在包装字符串时不会添加空格填充。我如何将它们放在列中?

列表:

JSONObject jsonObject = new JSONObject(jsonString);
JSONArray jsonArray = jsonObject.getJSONArray("valueSet");
for(int i=0; i<jsonArray.length(); i++) {
    System.out.println(jsonArray.optJSONObject(i).get("value").toString());
}

代码:

product_list = [{'num': 1, 'brands': 'Auchan', 'product_name': 'Pain de mie complet spécial sandwich', 'id': 213, 'cat_id': 3, 'nutrition_grade_fr': 'A'}, {'num': 2, 'brands': 'Bjorg', 'product_name': 'Pain complet 3 céréales', 'id': 211, 'cat_id': 3, 'nutrition_grade_fr': 'A'}, {'num': 3, 'brands': 'Brioche Pasquier', 'product_name': 'Biscotte au son, La Biscotte Blé Complet', 'id': 243, 'cat_id': 3, 'nutrition_grade_fr': 'A'}, {'num': 4, 'brands': 'Brioche Pasquier,Pasquier', 'product_name': 'La Biscotte Equilibre (36 biscottes)', 'id': 226, 'cat_id': 3, 'nutrition_grade_fr': 'A'}, {'num': 5, 'brands': 'Carrefour', 'product_name': 'Pain azyme', 'id': 299, 'cat_id': 3, 'nutrition_grade_fr': 'A'}, {'num': 6, 'brands': 'Carrefour', 'product_name': 'Spécial sandwich Complet 088€', 'id': 287, 'cat_id': 3, 'nutrition_grade_fr': 'A'}, {'num': 7, 'brands': 'Carrefour discount', 'product_name': 'Pain de mie Sandwich complet', 'id': 262, 'cat_id': 3, 'nutrition_grade_fr': 'A'}, {'num': 8, 'brands': 'Céréal Bio', 'product_name': 'Tartines croquantes multicéréales - riz, sarrasin & quinoa', 'id': 258, 'cat_id': 3, 'nutrition_grade_fr': 'A'}]

结果:

for item in product_list:
    menu = '{} - {}'.format(item['brands'], item['product_name'])
    menu = textwrap.fill(menu, width=60)
    print('{:>2}. {:<60} Score : {}'.format(
    item['num'], menu, item['nutrition_grade_fr']))

我想要的是什么:

1. Bio Village,Marque Repère - 36 biscottes au germe de blé     Score : A
2. Bjorg - Pain complet 3 céréales                              Score : A
3. Brioche Pasquier - Biscotte au son, La Biscotte Blé Complet  Score : A
4. Brioche Pasquier,Pasquier - La Biscotte Equilibre (36
biscottes) Score : A
5. Carrefour - Pain azyme                                       Score : A
6. Carrefour - Spécial sandwich Complet 088€                    Score : A
7. Carrefour discount - Pain de mie Sandwich complet            Score : A
8. Céréal Bio - Tartines croquantes multicéréales - riz,
sarrasin & quinoa Score : A

解决了:

1. Bio Village,Marque Repère - 36 biscottes au germe de blé     Score : A
2. Bjorg - Pain complet 3 céréales                              Score : A
3. Brioche Pasquier - Biscotte au son, La Biscotte Blé Complet  Score : A
4. Brioche Pasquier,Pasquier - La Biscotte Equilibre (36
   biscottes)                                                   Score : A
5. Carrefour - Pain azyme                                       Score : A
6. Carrefour - Spécial sandwich Complet 088€                    Score : A
7. Carrefour discount - Pain de mie Sandwich complet            Score : A
8. Céréal Bio - Tartines croquantes multicéréales - riz,
   sarrasin & quinoa                                            Score : A

谢谢ukemi,你给了我一个开始的想法。 有没有人有更简单的方法?

1 个答案:

答案 0 :(得分:0)

您可以通过更改subsequent_indent参数来修复后续行中的缩进:

...
menu = textwrap.fill(menu, width=60, subsequent_indent="    ") #4 spaces, length of " x. "
...

 1. Auchan - Pain de mie complet spécial sandwich               Score : A
 2. Bjorg - Pain complet 3 céréales                             Score : A
 3. Brioche Pasquier - Biscotte au son, La Biscotte Blé Complet Score : A
 4. Brioche Pasquier,Pasquier - La Biscotte Equilibre (36
    biscottes) Score : A
 5. Carrefour - Pain azyme                                      Score : A
 6. Carrefour - Spécial sandwich Complet 088€                   Score : A
 7. Carrefour discount - Pain de mie Sandwich complet           Score : A
 8. Céréal Bio - Tartines croquantes multicéréales - riz,
    sarrasin & quinoa Score : A

您可能需要使用稍微复杂一些的逻辑来修复后续行的正确对齐方式,其中包括以下内容:

line_length = 60

for item in product_list:
    menu = '{} - {}'.format(item['brands'], item['product_name'])
    menu = textwrap.fill(menu, width=line_length, subsequent_indent="    ")
    curr_length = len(menu)
    if curr_length > line_length:
        space = 2*line_length - curr_length #Computes space needed for overflowing lines
    else:
        space = 0

    print('{:>2}. {:<60}{} Score : {}'.format(item['num'], menu, " "*space, item['nutrition_grade_fr']))

 1. Auchan - Pain de mie complet spécial sandwich               Score : A
 2. Bjorg - Pain complet 3 céréales                             Score : A
 3. Brioche Pasquier - Biscotte au son, La Biscotte Blé Complet Score : A
 4. Brioche Pasquier,Pasquier - La Biscotte Equilibre (36
    biscottes)                                                  Score : A
 5. Carrefour - Pain azyme                                      Score : A
 6. Carrefour - Spécial sandwich Complet 088€                   Score : A
 7. Carrefour discount - Pain de mie Sandwich complet           Score : A
 8. Céréal Bio - Tartines croquantes multicéréales - riz,
    sarrasin & quinoa                                           Score : A

注意:不是实际输出,运行您的原始代码我无法复制您的结果 - 这些行未正确对齐。每个'得分'位是左侧或右侧的一个或两个空格。