需要帮助漂亮打印python

时间:2016-12-24 06:13:07

标签: python list

我正在使用Python自动化无聊的东西,并找到了一个我似乎可以破解的项目。它非常适合打印列表列表,因此它们可以正确对齐,因此您必须在给定的列表列表中找到最长的字符串长度。我试图将列表列表连接成一个列表,然后从中找到max len值,并将其转换为for循环以打印对齐到该长度的每个字符串,但它不会似乎工作。我的代码没有占用所有字符串值的最大长度。我认为它只从第一个列表中获取最大长度,因为它表示最大长度为7(从'oranges'我假设),当它应该是8(来自“cherries')。我唯一的猜测是它与itertools有关,而itertools.chain并不会立即在一个动作中连接列表列表,而是作为列表迭代它们,所以第一个迭代采用了第一个列表,并且{{ 1}}函数只取得了第一个列表的最大值,而不是整个新的列表。知道如何修复此代码以使其正常工作吗?

此外,是否有更简单的方法来连接列表,例如在Haskell中,只有longWord函数来连接任何给定的列表列表。有没有比concat更短的东西?

itertools.chain.from_iterable

2 个答案:

答案 0 :(得分:0)

当你使用longWord = len(max(newlist)时,它会返回第一个具有最高ascii值的单词,这就是为什么它返回" oranges"。要查找列表中可用字符串的max_length,请使用以下代码:

newlist = list(itertools.chain.from_iterable(tableData))
max_length,longest_element = max([(len(x),x) for x in newlist])

根据您的要求使用max_length,longest_element。

答案 1 :(得分:0)

正如其他人所说,使用max将按字典顺序比较字符串,而不是长度。如果您需要,您需要添加key=len

print(max(["abc", "b", "cd"], key=len)) # ==> abc

请注意,执行“想做”操作的“Pythonic”方式可能是

longword = max(len(s)
               for L in lists
               for s in L)

即使我个人觉得这种多元理解语法有点“落后”而且更喜欢

longword = max(max(len(s) for s in L)
               for L in lists)

甚至

longword = max(max(map(len, L))
               for L in lists)

(但要注意大多数Pythonistas不使用map

关于连接列表,您可以使用sum(lists, [])。但请注意,创建单个列表只是为了找到最长的单词似乎很愚蠢。