12

我正在制作一个从列表中返回最长字符串值的函数。我的代码在只有一个字符最多的字符串时有效。如果有多个字符串,我试图让它打印所有最长的字符串,并且我不希望它们被重复。当我运行它时,它只返回'hello',而我希望它也返回'ohman'和'yoloo'。我觉得问题出在这条线上if item not list:,但我已经尝试了所有方法,但它不起作用。

list = ['hi', 'hello', 'hey','ohman', 'yoloo', 'hello']
def length(lists):
    a = 0 
    answer = ''
    for item in lists:
        x = len(item) 
    if x > a:
        a = x
        answer = item
    elif x == a:
        if item not in list:
            answer = answer + ' ' + item
    return answer
print length(list)
4

5 回答 5

23

首先,我们可以找到列表中任意字符串的最大长度:

stringlist = ['hi', 'hello', 'hey','ohman', 'yoloo', 'hello']
#maxlength = max([len(s) for s in stringlist])
maxlength = max(len(s) for s in stringlist)  # omitting the brackets causes max 
                                             # to operate on an iterable, instead
                                             # of first constructing a full list
                                             # in memory, which is more efficient

一点解释。这称为列表理解,它允许您将一个列表理解为另一个列表。该代码的 [len(s) for s in stringlist]意思是“生成一个类似列表的对象,通过获取stringlist,并且对于s该列表中的每个,给我,len(s)(该字符串的长度)。

所以现在我们有一个列表[2, 5, 3, 5, 5, 5]。然后我们调用它的内置max()函数,它会返回5.

现在您有了最大长度,您可以过滤原始列表:

longest_strings = [s for s in stringlist if len(s) == maxlength]

这就像它用英文读到的那样:“对于sstringlist 中的每个字符串,给我那个字符串s,如果len(s)等于maxlength。”

最后,如果要使结果唯一,可以使用set()构造函数生成唯一集:

unique_longest_strings = list(set(longest_strings))

(我们呼吁list()在删除重复项后将其转回列表。)


这归结为:

ml = max(len(s) for s in stringlist)
result = list(set(s for s in stringlist if len(s) == ml))

注意:不要使用名为 的变量list,因为它会覆盖list类型名称的含义。

于 2012-12-20T03:02:16.990 回答
11

我非常赞同 Jonathon Reinhart 的回答,但我就是忍不住……这个怎么样?

max(map(len, stringlist))

没有必要写一个列表推导,这更简单......

于 2012-12-20T03:20:20.267 回答
0

可能你写错了if item not in list:,缩进错误,修改如下:

def length(lists):
    a = 0
    answer = ""


    for item in lists:
        x = len(item)
        if x > a:
            a = x
            answer = item
        elif x == a:
            if item not in ans:
                answer = answer + " " + item
    return answer

但我认为 Jonathon Reinhart 提供了更好的方法。

于 2012-12-20T03:17:16.327 回答
0

我有同样的问题。我以这种方式想出了我的解决方案:

myList =['hi', 'hello', 'hey','ohman', 'yoloo', 'hello']
def get_longest_strings(myList):
        longest=len(max(myList,key=len))
        for each in myList:
                if(longest==len(each)):
                       #common_result is list to store longest string in list
                       common_result.append(each)
        return common_result
print(common_result)
于 2016-09-11T19:15:43.593 回答
0

像这样的东西...

def allLongestStrings(inputArray):
    maxLength = len(max(inputArray, key = len))
    
    newArray = []
    
    lengthArray = len(inputArray)
    
    for i in range(lengthArray):
        if(len(inputArray[i])==maxLength):
            newArray.append(inputArray[i])
    return newArray
于 2021-04-27T14:03:55.770 回答