我有一个列表,例如:
x = [['aaa', 'bb','ccc'], ['ophkn','h','aa']]
假设len(x[i])
的所有有效值i
相同(上例中为0和1)。
现在,我需要构建一个列表,其中包含x
每个子列表中第j个项目的最大长度。也就是说,我需要知道以下内容:
max(len(x[i][j]))
超过i
的所有值,固定值为j
所以,在我上面的例子中,我会产生一个如下列表:
[5, 2, 3]
,因为
max(len('aaa'),len('ophkn')) --> 5
max(len('bb'),len('h')) --> 2
max(len('ccc'),len('aa')) --> 3
我试图找到这些最大值的原因是我可以打印带有填充空间的表格,如下所示:
aaa bb ccc
ophkn h aa
所以,如果有人以优雅的方式打印x
,使其以管状格式对齐,请分享!
答案 0 :(得分:4)
使用zip()
是另一种方法:
>>> [max(len(a), len(b)) for a, b in zip(*x)]
[5, 2, 3]
正如Robb在评论中指出的那样,为任意行数执行此操作的通用且有效的方法是:
[max(len(b) for b in a) for a in zip(*x)]
答案 1 :(得分:3)
在生成器表达式上使用max()
。例如,给定j
等于1:
>>> x = [['aaa', 'bb','ccc'], ['ophkn','h','aa']]
>>> j = 1
>>> max(len(i[j]) for i in x)
2
或者,循环遍历j
的所有值:
>>> for j in xrange(3):
... print max(len(i[j]) for i in x)
...
5
2
3
答案 2 :(得分:3)
您可以使用带有splat的zip,例如:
x = [['aaa', 'bb','ccc'], ['ophkn','h','aa']]
maxlens = map(len, (max(el, key=len) for el in zip(*x)))
# [5, 2, 3]
然后使用结果中的相应str.format
。
答案 3 :(得分:1)
我认为您希望根据所有子列表中最长的字符串对齐所有输出:
x = [['aaa', 'bb','ccc'], ['ophkn','h','aa']]
max(len(s) for y in x for s in y) # find length of longest string
for x, y, z in x:
print ("{0:<{1}} {2:<{3}} {4}".format(x, mx,y,mx ,z))
aaa bb ccc
ophkn h aa
您可以使用Format Specification Mini-Language根据最长字符串对齐文字。
没有测试太多,但似乎适用于任意长度的行:
x = [['aaa', 'bb','ccc',"guido"], ['ophkn','h','aa',"van"],["foo","bar","foobar","rossum"]]
mx = max(len(s) for y in x for s in y)
d = {"m":mx} # to pass as key because you can only have only named arguments after *exp
for ele in x:
print("".join("{:<{mx}} "*len(ele)).format(mx=d["m"],*tuple(ele)))
aaa bb ccc guido
ophkn h aa van
foo bar foobar rossum
我们需要使用dict
传递max length/mx
,因为我们在*tuple(ele)
之后无法使用args,因此我们无法像第一个示例中那样使用索引编号只打印了前两个子串。
使用{:<{mx}}
允许我们将嵌套{}
作为align参数。
"".join("{:<{mx}} "*len(ele)
根据行的长度创建尽可能多的格式{}
。