Python列表中子列表第j个元素的最大长度

4

我有一个列表,例如:

x = [['aaa', 'bb','ccc'], ['ophkn','h','aa']]

假设对于所有有效的i (在上面的示例中为0和1),len(x[i])都相同。

现在,我需要构造一个包含每个子列表中第j个项目的最大长度的列表x。也就是说,我需要知道以下内容:

对于固定的j值,在所有i值中的max(len(x[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个回答

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)]

我相信OP正在寻找任意行数的解决方案。 - Roman Bodnarchuk
1
我最喜欢这种方法,但为了将其推广到任意行数,您可以在max中使用生成器:[max(len(b) for b in a) for a in zip(*x)] - Robb
感谢@Robb。已更新答案以反映此事。 - shaktimaan

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

3

您可以使用解包符和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

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

你可以使用格式规范迷你语言根据最长的字符串来对齐文本。
尚未经过太多测试,但似乎适用于任意长度的行:
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)之后我们不能有参数,所以我们不能像第一个示例中那样使用索引数字,否则我们只会得到前两个子字符串的输出。
使用{:<{mx}}允许我们将嵌套的{}作为对齐参数。 "".join("{:<{mx}} "*len(ele)为行的长度创建了尽可能多的格式化{}

太棒了!它是否适用于任意长度的“行”? - synaptik
所有的行长度都会相同吗? - Padraic Cunningham
是的。所有字符串长度都相同。它们将形成一个大的字符串矩阵(其中没有任何字符串包含空格)。 - synaptik
@synaptik,我在我的答案中添加了一些内容,请看看对你有没有帮助。 - Padraic Cunningham

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接