如何从 python 中的列表(可能包含奇数个元素)中打印两列对齐的文本?

How to print two aligned columns of text from a list (which may have an odd number of elements) in python?

我有一些代码可以从用户那里获取输入并将其存储在列表中。该列表可能包含奇数个或偶数个元素,例如: my_list = ['Beef','Chicken','Eggs','Lamb','Nuts','Pork'](偶数个元素)

my_list = ['Beef','Chicken','Eggs','Lamb','Nuts','Pork','Potatoes'](奇数个元素)

我想将 my_list 存储在一个字符串变量中,这样当我 print(var) 或创建一个 tkinter 消息框时,我的程序将输出两列,如下所示:

-- Beef       --Chicken
-- Eggs       --Lamb
-- Nuts       --Pork
-- Potatoes

我知道如何操作字符串,但我一直在创建列。我试过这个:

for x,y in zip(my_list[0::2], my_list[1::2]):
    print("{0} {1}".format(x, y))

但这不适用于奇数长度的列表。 我也试过更复杂的:

#When my_list = ['Beef','Chicken','Eggs','Lamb','Nuts','Pork','Potatoes']
list1 = []
list2 = []
while len(my_list) != 0:
        list1.append(my_list[0])
        my_list.pop(0)
        if len(my_list) == 0:
            list2.append('')
        else:
            list2.append(my_list[0])
            my_list.pop(0)
    for i in range (len(list1)):
        blank_space = 40 - len(list1[i-1])
        string2 = "\n--" + list1[i] + ' '*blank_space + '--' + list2[i]
        string1 = string1 + string2
    print(string1)

但我得到的输出是这样的:

--Beef                                --Chicken
--Eggs                                    --Lamb
--Nuts                                    --Pork
--Potatoes                                    --

没有正确对齐列。

除了将其分成列外,输出的格式也很重要:

--Element1    --Element2
--Element3    --Element4

而不是任何其他形式。对于我犯错的地方,我真的很感激任何帮助。如果您需要更多说明,请告诉我,我会将其添加到我的问题中。

编辑: 该函数必须适用于所有这些列表:

my_list = ['Beef','Chicken','Eggs','Lamb','Nuts','Pork']
my_list = ['Beef','Chicken','Eggs','Lamb','Nuts','Pork','Potatoes']
my_list = ['Beef','Chicken','Eggs','Lamb','Nuts','Pork','Potatoes','Dairy']
my_list = ['Australian Beef','Chicken','Eggs','Lamb','Nuts','Pork','Potatoes','Dairy']

第二次编辑 我终于意识到为什么有时它不对齐。空格数是正确的,所以你的所有答案都是正确的。不幸的是,因为有些字母比其他字母更细,所以列不会很好地对齐(至少在 Python IDLE 和 Tkinter 中)。例如,iiii 比 Python 中的 mmmm 短。有办法解决这个问题吗?

像下面这样的东西怎么样,它使用了超出范围的切片不会引发错误的事实:

my_list = ['Beef','Chicken','Eggs','Lamb','Nuts','Pork','Potatoes']

for i in range(0, len(my_list), 2):
    print(' '.join(f"-- {s:10}" for s in my_list[i:i+2]))

输出:

-- Beef       -- Chicken
-- Eggs       -- Lamb
-- Nuts       -- Pork
-- Potatoes

或者想获取单个字符串,可以嵌套join:

output = '\n'.join(' '.join(f"-- {s:10}" for s in my_list[i:i+2]) for i in range(0, len(my_list), 2))

给你:-)

可变列,验证最长的词适合并且应该非常有效

# Figure out the number of columns you wish to have in your table.
COLUMNS = 2

my_list = ['Beef','Chicken','Eggs','Lamb','Nuts','Pork','Potatoes']

# Figure our the length of the longest word in the list
longest_word_length = max(map(len,my_list))

# Create a format string that will add some spacing to the list
format_string = f'-- {{0:{longest_word_length+2}}}'

output = []

# Format all the items in the list
for index, item in enumerate(my_list, start=1):
    output.append(format_string.format(item))
    if index % COLUMNS == 0:
        output.append('\n')

print(''.join(output))

您也可以将 tabulate"plain" 格式一起使用,这是一种简单的方法。

我试着把它放在评论中,但它太长了,所以它变成了自己的答案。为了扩展其他答案,我认为解释代码的作用是个好主意。

将代码分成几部分,从 j1-lee 的回答开始,我们有:

for i in range(0, len(my_list), 2):
    print(' '.join(f"-- {s:10}" for s in my_list[i:i+2]))

output = '\n'.join(' '.join(f"-- {s:10}" for s in my_list[i:i+2]) for i in range(0, len(my_list), 2))

有几个部分:

  • f-strings 是格式化字符串的便捷方式。引号前的 f 表示 f 字符串。
  • 在 f 字符串中有一个变量 s,它是列表理解 for s in my_list[i:i+2] 的一部分。 {s:10}表示字符串的长度为10。 (或者您可以像 Bharel 那样做一些事情,并有另一个与最长字符串的长度相关的变量,并使用它代替 10。)如果您打算将它应用于不同的列表,这可能是个好主意。
  • (f"-- {s:10}" for s in my_list[i:i+2]) 创建一个生成器,例如,如果你写 x = (f"-- {s:10}" for s in my_list[0:0+2]) 然后尝试 for i in x: print(i) 您的输出将是两个字符串:-- Beef-- Chicken.
  • ' '.join(...) 将它们连接在一个列表中,就像 j1-lee 所说的那样,如果你将它们嵌套在多个列表理解中,你可以得到一行。

我认为通过结合 j1-lee 和 Bharel 所做的,您可能会得到最通用的。请注意,我删除了 join 命令中的 space,因为现在有一个变量定义了列之间的 space。

def generate_columns(list_in, n_columns, column_space, output_as_list = True):
    # Figure our the length of the longest word in the list
    longest_word_length = max(map(len,list_in))
    column_length = longest_word_length + column_space

    output = [''.join([f"-- {s:{column_length}}" \
                       for s in my_list[i:i+n_columns]]) for i in range(0, len(my_list), n_columns)]
    if output_as_list:
        return output
    return '\n'.join(o for o in output)


my_list = ['Beef','Chicken','Eggs','Lamb','Nuts','Pork','Potatoes']

print(generate_columns(my_list, 3, 5))
#['-- Beef         -- Chicken      -- Eggs         ', '-- Lamb         -- Nuts      -- Pork         ', '-- Potatoes     ']
print(generate_columns(my_list, 2, 3, output_as_list = False))
#-- Beef       -- Chicken
#-- Eggs       -- Lamb
#-- Nuts       -- Pork
#-- Potatoes