Python 如何获得没有元音的单词列表?

Python 如何获得没有元音的单词列表?,python,list,Python,List,对于有元音的单词来说,输出是很好的,但是我正在努力找到一种方法来从列表中输出没有元音的单词。提前谢谢你的帮助 alien_names = ['stena', 'venah', 'blyhp', 'spiuy', 'elbas', 'wynts', 'ergez'] print("Alien Name List is: ",alien_names) vowel = ['a','e','i','o','u'] alien_vowels = [word for word in a

对于有元音的单词来说,输出是很好的,但是我正在努力找到一种方法来从列表中输出没有元音的单词。提前谢谢你的帮助

alien_names = ['stena', 'venah', 'blyhp', 'spiuy', 'elbas', 'wynts', 'ergez']
print("Alien Name List is: ",alien_names)

vowel = ['a','e','i','o','u']
alien_vowels = [word for word in alien_names if any(v in word for v in vowel)]
print("Alien name list with names that include vowels: ",alien_vowels)
#works as expected

vowset = set(vowel)
for word in alien_names:
    if word in alien_names != vowel:
        print(word)
#desired output: "blyph", "wynts"
#actual output: all names

谢天谢地,做你想做的事真是太容易了。只需将
any
替换为
not any

alien_no_vowels = [word for word in alien_names if not any(v in word for v in vowel)]
# output: ['blyhp', 'wynts']

Random Davis已经提供了一个很好的答案,下面是一些不同的代码,这些代码更接近您的尝试,并且对于初学者来说更容易阅读和理解:

alien_names = ['stena', 'venah', 'blyhp', 'spiuy', 'elbas', 'wynts', 'ergez']
vowels = ['a','e','i','o','u']
alienNoVowels=[]
for name in alien_names:
    hasVowel=False
    for vowel in vowels:
        if vowel in name:
            hasVowel=True
    if not hasVowel:                       #same as  "if hasVowel==False"
        alienNoVowels+=[name]

保留您的代码,您只需检查
alien_names
中的哪个单词不在
alien_元音中

alien_names = ['stena', 'venah', 'blyhp', 'spiuy', 'elbas', 'wynts', 'ergez']
print("Alien Name List is: ", alien_names)

vowel = ['a', 'e', 'i', 'o', 'u']
alien_vowels = [word for word in alien_names if any(v in word for v in vowel)]
print("Alien name list with names that include vowels: ", alien_vowels)
#works as expected

for word in alien_names:
    if word not in alien_vowels:
        print(word)
输出:


使用
set.isdisjoint

>>> *filter(set(vowel).isdisjoint, alien_names),
('blyhp', 'wynts')

下面是使用
set.intersection
执行此操作的简单方法。有趣的是,在过去7年的每次面试中,我都会把这个问题作为面试问题,看看应聘者使用了多少
for
循环

alien_names = ['stena', 'venah', 'blyhp', 'spiuy', 'elbas', 'wynts', 'ergez']
vowel = ['a','e','i','o','u']

[i for i in alien_names if set(i).intersection(vowel)==set()]

#Or as @superb rain remarked,
#[i for i in alien_names if set(i).isdisjoint(vowel)]
可能有点长)但效率很高;)

编辑-谢谢

我们应该将
如果名称中的x替换为\u元音:pass
替换为
如果名称中的x不是\u元音:
,这是旧代码,在这7年里,没有人告诉过你
isdisjoint
?:-PI除了以不同的方式编写相同的内容外,看不出它带来了什么新的东西:)它本身更短,允许更短的使用(如我的回答中所示),而且更高效(它在第一个公共元素处停止,而不是总是计算整个交集)。是的,虽然我问的问题是一个有点变化,这将需要交叉口。无论如何,谢谢你的建议。一般来说,我不会做一个带通行证的
if
条件,而是使用
if not条件:
。在这种情况下,只写
如果x不在名称中,则用_元音:
似乎是更好的方法。@HilbertB,
如果x不在名称中,则用_元音:
将更具可读性,依我看。@JustinEzequiel我可以发誓PEP 8也更喜欢这样,但显然我把它与
不是
(它更喜欢
不是…是
)@JustinEzequiel至于可读性,我同意,我只是习惯性地把布尔的否定放在任何给定语句的开头。@hilbertly,谢谢!
alien_names = ['stena', 'venah', 'blyhp', 'spiuy', 'elbas', 'wynts', 'ergez']
vowel = ['a','e','i','o','u']

[i for i in alien_names if set(i).intersection(vowel)==set()]

#Or as @superb rain remarked,
#[i for i in alien_names if set(i).isdisjoint(vowel)]
['blyhp', 'wynts']