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