问题:通过过滤较低的列表,创建一个至少有 5 个字母长且其字母已按字母顺序排列的单词列表。
我有的:
[word for word in lowers if len(word)>= 5 and word.sort=word]
我知道这不会起作用,因为 word.sort 正在用于字符串,并且 word 需要是一个列表才能使此功能起作用。我将如何在列表理解中执行此操作,或者我之前是否需要定义一些东西。
问题:通过过滤较低的列表,创建一个至少有 5 个字母长且其字母已按字母顺序排列的单词列表。
我有的:
[word for word in lowers if len(word)>= 5 and word.sort=word]
我知道这不会起作用,因为 word.sort 正在用于字符串,并且 word 需要是一个列表才能使此功能起作用。我将如何在列表理解中执行此操作,或者我之前是否需要定义一些东西。
>>> sorted('foo') == list('foo')
True
>>> sorted('bar') == list('bar')
False
最简单的方法是使用列表推导:
[word for word in lowers if len(word)>=5 and sorted(word)==list(word)]
另一个是使用 Python 2 的过滤器功能来处理类似的事情。此外,这使用 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)
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]