按字母顺序排序的if语句无效
下面的if语句有个问题,我找不到原因。有没有什么常见的写法错误或者方法使用不当,可能导致它不能正常工作?checkList是用户输入的一句话,而lis是一个包含很多单词的大列表。
def realCheck(checkList):
string = "".join(checkList)
print string
wordList = string.split()
if match(wordList, lis).sort(key=str.lower) == wordList.sort(key=str.lower):
return True
else:
return False
2 个回答
.sort
这个方法,就像其他很多用来改变容器内容的方法一样,返回的是None
。所以把a.sort()
和b.sort()
进行比较是没有意义的,因为它们的结果都是None
!我觉得你应该比较的是sorted(match(wordList, lis), key=str.lower)
和sorted(worldList, key=str.lower)
。
需要注意的是,你使用的key
在这里其实并不重要:如果两个列表里的元素在大小写上有区别,即使它们看起来是“相似”的,比较的时候也不会被认为是相等的!
所以一个更好的方法可能是比较sorted(s.lower() for s in match(wordList, lis))
和sorted(s.lower() for s in worList)
。在这里,key=
是不需要的,因为你已经把元素都转换成了小写,所以它们自然会按照小写的方式进行排序。
如果checkList是一个字符串,那就没必要用
"".join(checkList)
。这样做只是会返回同样的字符串:In [94]: checkList="This is a sentence" In [95]: "".join(checkList) Out[95]: 'This is a sentence'
第一行
string = "".join(checkList)
的缩进不对。把它调整到和其他行对齐。不要把变量命名为
string
。这样会覆盖掉Python里同名的标准模块。假设
match(wordList, lis)
返回的是一个列表。sort
方法会对这个列表进行排序,但返回None
。因为None == None
是True
,所以:if match(wordList, lis).sort(key=str.lower) == wordList.sort(key=str.lower):
这个条件总是成立。
更可能的是,你想要的是:
sorted(astr.lower() for astr in match(wordList, lis))==sorted(astr.lower() for astr in wordList)
与
sort
方法不同,sorted函数会返回排序后的列表。正如Alex Martelli所指出的,
sorted(match(wordList, lis),key=str.lower)==sorted(wordList,key=str.lower)
总是和
sorted(match(wordList, lis))==sorted(wordList)
有相同的真假值。
所以,把
str.lower
作为排序的key
(而不是在比较==
之前进行转换)可能不是你想要的结果。这条语句
if condition: return True else: return False
可以简化为:
return condition