12

リストから最長の文字列値を返す関数を作成していました。私のコードは、文字数が最も多い文字列が1つしかない場合に機能します。複数の文字列がある場合は、最も長い文字列をすべて印刷するようにしましたが、それらを繰り返さないようにしました。これを実行すると、「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]

sこれは、英語で読むのと同じように機能します。「 stringlistの各文字列について、が等しいs場合は、その文字列を指定してください。」len(s)maxlength

最後に、結果を一意にしたい場合は、set()constuctorを使用して一意のセットを生成できます。

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

しかし、JonathonReinhartがより良い方法を提供したと思います。

于 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 に答える