Python列表的子列表中第j个项目的最大长度

时间:2014-08-22 19:09:24

标签: python text formatting

我有一个列表,例如:

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,使其以管状格式对齐,请分享!

4 个答案:

答案 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)根据行的长度创建尽可能多的格式{}