我想要的是删除其中有两个以上连续元音的单词。所以输入:
s = " There was a boat in the rain near the shore, by some mysterious lake"
输出:
[boat,rain,near,mysterious]
这是我的代码。我只是想知道是否有更好的方法可以做到这一点,或者它是否足够有效?是否可以使用python dict做到这一点,还是列表可以?:)我是python的新手,是的。:)评论会很好。
def change(s): vowel = ["a","e","i","o","u"] words = [] a = s[:].replace(",","").split() for i in vowel: s = s.replace(i, "*").replace(",","") for i,j in enumerate(s.split()): if "**" in j: words.append(a[i]) return words
使用集:
使用set.intersection的第一种方法只能找到不相同的连续对,因此oo不会是匹配项:
oo
s = " There was a boat in the rain near the shore, by some mysterious lake" vowels = "aeiouAEIOU" print([x for x in s.split() if any(len(set(x[i:i+2]).intersection(vowels))== 2 for i in range(len(x))) ]) ['boat', 'rain', 'near', 'mysterious']
方法2使用set.issubset,因此现在将相同的连续对视为匹配。
使用set.issubset与函数使用yield from蟒3语法,这可能是更合适的,并确实捕捉重复相同元音:
set.issubset
yield from
vowels = "aeiouAEIOU" def get(x, step): yield from (x[i:i+step] for i in range(len(x[:-1]))) print([x for x in s.split() if any(set(pr).issubset(vowels) for pr in get(x, 2))])
或再次在单个列表中:
print([x for x in s.split() if any(set(pr).issubset(vowels) for pr in (x[i:i+2] for i in range(len(x[:-1]))))])
最后,将元音设为一个集合,并检查它是否为任何字符对的set.issuperset:
vowels = {'a', 'u', 'U', 'o', 'e', 'i', 'A', 'I', 'E', 'O'} def get(x, step): yield from (x[i:i+step] for i in range(len(x[:-1]))) print([x for x in s.split() if any(vowels.issuperset(pr) for pr in get(x, 2))])