使用列表理解和集合

时间:2012-11-12 18:03:23

标签: python set list-comprehension

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

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

例如,"膨胀"应该包括在你的清单中,因为由奇数字母形成的单词,#blond;#34;以及由偶数字母组成的单词" aloe",都在一组小写单词。同样,"三年一度"分裂成" asily"和"肾脏",两者都在单词列表中。

我的老师告诉我们,我们应该使用一套: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 个答案:

答案 0 :(得分: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]

答案 1 :(得分: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包含有效的字词和“搜索”字样,如'ballooned'和'triennially',无论如何你应该能够使用在列表理解中的上述条件,以获得正确的结果。

答案 2 :(得分:1)

list(word)(::2)

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

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

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

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

一般来说,分开测试某些部件以确定它们是否真的按照您的想法行事总是一个好主意。

答案 3 :(得分: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))]

使用[::]而非(::)并且此处不需要list(),加上使用位于奇数位置的字母形成的单词使用[1::2]

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

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