考虑到逗号,我想对齐一组数字:
10 3
200 4000,222 3 1,5
200,21 0,3 2
30000 4,5 1
mylist = [['10', '3', '', ''],
['200', '4000,222', '3', '1,5'],
['200,21', '', '0,3', '2'],
['30000', '4,5', '1', '']]
我想要的是根据逗号对齐此列表:
预期结果:
mylist = [[' 10 ', ' 3 ', ' ', ' '],
[' 200 ', '4000,222', '3 ', '1,5'],
[' 200,21', ' ', '0,3', '2 '],
['30000 ', ' 4,5 ', '1 ', ' ']]
我试着翻了一下列表:
mynewlist = list(zip(*mylist))
并在每个子列表中找到逗号后最长的部分:
for m in mynewlist:
max([x[::-1].find(',') for x in m]
并使用 rjust 和 ljust,但我不知道如何在逗号之后使用 ljust 并在逗号之前使用 rjust,两者都在同一个字符串中。
如何在不使用 format() 的情况下解决这个问题? (我想对齐 ljust 和 rjust)
最佳答案
这是目前可以解决问题的另一种方法。不幸的是,我看不到任何简单的方法来完成这项工作,可能是时间原因:-)
不管怎样,我都会解释的。 r
是事先创建的结果列表。
r = [[] for i in range(4)]
然后我们遍历这些值并使用 enumerate
获取索引:
for ind1, vals in enumerate(zip(*mylist)):
在循环中,我们获取存在的十进制数字的最大长度和单词的最大长度(没有十进制数字的单词):
l = max(len(v.partition(',')[2]) for v in vals) + 1
mw = max(len(v if ',' not in v else v.split(',')[0]) for v in vals)
现在我们遍历元组 vals
中的值并构建我们的结果(是的,目前无法想出避免这种嵌套的方法)。
for ind2, v in enumerate(vals):
如果它包含逗号,则应采用不同的格式。具体来说,我们根据单词的最大长度rjust
mw
然后添加十进制数字和所需的任何空格:
if ',' in v:
n, d = v.split(',')
v = "".join((n.rjust(mw),',', d, " " * (l - 1 - len(d))))
在相反的情况下,我们简单地 .rjust
然后添加空格:
else:
v = "".join((v.rjust(mw) + " " * l))
最后,我们将 append
到 r
。
r[ind1].append(v)
一起:
r = [[] for i in range(4)]
for ind1, vals in enumerate(zip(*mylist)):
l = max(len(v.partition(',')[2]) for v in vals) + 1
mw = max(len(v if ',' not in v else v.split(',')[0]) for v in vals)
for ind2, v in enumerate(vals):
if ',' in v:
n, d = v.split(',')
v = "".join((n.rjust(mw),',', d, " " * (l - 1 - len(d))))
else:
v = "".join((v.rjust(mw) + " " * l))
r[ind1].append(v)
现在,我们可以打印出来了:
>>> print(*map(list,zip(*r)), sep='\n)
[' 10 ', ' 3 ', ' ', ' ']
[' 200 ', '4000,222', '3 ', '1,5']
[' 200,21', ' ', '0,3', '2 ']
['30000 ', ' 4,5 ', '1 ', ' ']
关于python - 对齐子列表中的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41324621/