【问题标题】:alphabetically sorted if statement not working如果语句不起作用,按字母顺序排序
【发布时间】:2010-10-02 23:34:15
【问题描述】:

下面的 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  

【问题讨论】:

    标签: python mutators


    【解决方案1】:
    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) 返回一个列表。排序方法 对列表进行排序,并返回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
      

    【讨论】:

      【解决方案2】:

      .sort,就像几乎所有其他容器的 mutator 方法一样,返回 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=,因为您正在比较 小写 项,因此它们会“按自然”按这种方式排序。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-03
        • 2023-03-28
        • 2017-09-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多