按字母顺序排序的if语句无效

1 投票
2 回答
934 浏览
提问于 2025-04-16 04:54

下面的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 个回答

4

.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=是不需要的,因为你已经把元素都转换成了小写,所以它们自然会按照小写的方式进行排序。

5
  1. 如果checkList是一个字符串,那就没必要用"".join(checkList)。这样做只是会返回同样的字符串:

    In [94]: checkList="This is a sentence"    
    In [95]: "".join(checkList)
    Out[95]: 'This is a sentence'
    
  2. 第一行string = "".join(checkList)的缩进不对。把它调整到和其他行对齐。

  3. 不要把变量命名为string。这样会覆盖掉Python里同名的标准模块。

  4. 假设match(wordList, lis)返回的是一个列表。sort方法会对这个列表进行排序,但返回None。因为None == NoneTrue,所以:

    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(而不是在比较==之前进行转换)可能不是你想要的结果。

  5. 这条语句

    if condition:
        return True
    else:
        return False
    

    可以简化为:

    return condition
    

撰写回答