【问题标题】:Using list comprehension and sets使用列表理解和集合
【发布时间】:2012-11-01 04:31:02
【问题描述】:

创建并打印同时满足以下两个条件的单词列表:

  • 单词长度至少为 8 个字符;
  • 由奇数字母组成的单词在小写单词集合中;和
  • 由偶数字母组成的单词在小写单词集中。

例如,单词“ballooned”应该包含在您的列表中,因为由奇数字母组成的单词“金发”和由偶数字母组成的单词“aloe”都在小写单词的集合。类似地,“triennially”分为“tinily”和“renal”,两者都在词表中。

我的老师告诉我们应该使用一组:s=set(lowers),因为这样会更快。

到目前为止我有什么:

s=set(lowers)
[word for word in lowers if len(word)>=8
                        and list(word)(::2) in s
                        and list(word)(::-2) in s]

我不认为我正在使用设置权。有人可以帮我解决这个问题

【问题讨论】:

    标签: python set list-comprehension


    【解决方案1】:

    问题是您将word 转换为列表(不必要),您的切片不在括号中(您使用了括号),并且您的第二个切片使用了错误的索引(应该是1::2,而不是::-2 )。

    以下是正确完成的切片:

    >>> word = "ballooned"
    >>> word[::2]
    'blond'
    >>> word[1::2]
    'aloe'
    

    请注意,s 是小写单词集合的奇怪名称。一个更好的名字是words

    您对set 的使用是正确的。您的老师希望您使用集合的原因是,测试集合的成员资格比测试列表的速度快得多

    把它放在一起:

    words = set(lowers)
    [word for word in words if len(word) >= 8
                            and word[::2] in words
                            and word[1::2] in words]
    

    【讨论】:

      【解决方案2】:

      下面是一个快速示例,说明如何在列表理解中构建条件检查:

      >>> word = 'ballooned'
      >>> lowers = ['blond', 'aloe']
      >>> s = set(lowers)
      >>> len(word) >= 8 and word[::2] in s and word[1::2] in s
      True
      

      编辑:刚刚意识到lowers 包含有效词和“搜索”词,如“气球”和“三年一次”,无论如何您应该能够使用上述条件在您的列表理解中获得正确的结果。

      【讨论】:

        【解决方案3】:
        list(word)(::2)
        

        首先,访问索引范围的语法是使用方括号,另外,您不需要先将word转换为列表,您可以直接在字符串上这样做:

        >>> 'ballooned'[::2]
        'blond'
        

        另外,[::-2] 不会给你不均匀的词,而是另一个词的颠倒版本。您需要使用[1::2](即跳过第一个字符,然后每隔一个字符):

        >>> 'ballooned'[::-2]
        'dnolb'
        >>> 'ballooned'[1::2]
        'aloe'
        

        一般来说,单独测试某些部分以查看它们是否真的按照您认为的那样做总是一个好主意。

        【讨论】:

          【解决方案4】:

          应该这样做:

          s=set(lowers)
          [word for word in lowers if len(word)>=8 and word[::2] in s and word[1::2] in s]
          

          或使用all():

          In [166]: [word for word in lowers if all((len(word)>=8,
                                                         word[::2] in s,
                                                         word[1::2] in s))]
          

          使用[::]而不是(::),这里不需要list(),另外要获得由放置在奇数位置的字母组成的单词使用[1::2]

          In [151]: "ballooned"[::2]
          Out[151]: 'blond'
          
          In [152]: "ballooned"[1::2]
          Out[152]: 'aloe'
          

          【讨论】:

            猜你喜欢
            • 2016-06-16
            • 2021-08-10
            • 1970-01-01
            • 2012-02-14
            • 2019-04-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多