3

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

  • 该单词至少有 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]

我不认为我正在使用正确的设置。有人可以帮我让它工作吗

4

4 回答 4

2

问题是您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]
于 2012-11-12T18:08:47.013 回答
1

以下是如何在列表理解中构建条件检查的快速示例:

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

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

于 2012-11-12T18:09:11.117 回答
1
list(word)(::2)

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

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

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

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

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

于 2012-11-12T18:10:54.797 回答
0

这应该这样做:

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))]

使用[::]not (::),这里没有必要list(),加上获得由放置在奇数位置的字母组成的单词 use [1::2]

In [151]: "ballooned"[::2]
Out[151]: 'blond'

In [152]: "ballooned"[1::2]
Out[152]: 'aloe'
于 2012-11-12T18:09:09.133 回答