如何从 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
我有一些代码可以从用户那里获取输入并将其存储在列表中。该列表可能包含奇数个或偶数个元素,例如:
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