1

質問:下位リストをフィルタリングして、少なくとも5文字の長さで、すでにアルファベット順になっている単語のリストを作成します。

私が持っているもの:

[word for word in lowers if len(word)>= 5 and word.sort=word]

word.sortは文字列で使用されており、この関数を機能させるにはwordをリストにする必要があるため、これは機能しないことを知っています。リスト内包表記の横でこれをどのように行うか、または前に何かを定義する必要がありますか?

4

2 に答える 2

2
>>> sorted('foo') == list('foo')
True
>>> sorted('bar') == list('bar')
False
于 2012-10-01T02:06:55.953 に答える
1

最も簡単な方法は、リスト内包表記を使用することです。

[word for word in lowers if len(word)>=5 and sorted(word)==list(word)]

もう1つは、Python2のフィルター関数をこのようなものに使用することです。また、これはstring.joinを使用して、ソートされたリストを文字列に変換し直します

#Lambda function to test condition
test = lambda x: len(x)>=5 and ''.join(sorted(x))==x
#Returns list of elements for which test is True
filter(test, lowers)

プレーンなol'関数(ボーナス:ジェネレーターyield!):

def filterwords(lst):
    for word in lst:
        if len(word)>=5 and sorted(word)==list(word):
            yield word

最後のものは、最も効率的で、リソースの面でなどです。


更新:.sort()を(文字列ではなく)リストで使用してリストを直接ソートできますが、値を返しません。したがって、list(word).sort()ここでは役に立ちません。を使用しますsorted(word)

>>> lst = [1,100,10]
>>> sorted(lst) #returns sorted list
[1, 10, 100]
>>> lst #is still the same
[1, 100, 10]
>>> lst.sort() #returns nothing
>>> lst #has updated
[1, 10, 100]
于 2012-10-01T02:23:33.013 に答える