我正在尝试迭代一个列表,并将所有单词追加到一个新列表中,不包括有重复字母的单词。
示例:
words = ['cat', 'car', 'weevil', 'lizard', 'mammoth', 'cabbage', 'aardvaark']
newlist = []
for word in words:
for letter in word
if word.count(letter) > 1:
pass
else:
newlist.append(word)
print(newlist)
# Result
['cat', 'cat', 'cat', 'car', 'car', 'car', 'weevil', 'weevil', 'weevil', 'weevil', 'lizard', 'lizard', 'lizard', 'lizard', 'lizard', 'lizard', 'mammoth', 'mammoth', 'mammoth', 'mammoth', 'cabbage', 'cabbage', 'cabbage', 'aardvaark', 'aardvaark', 'aardvaark']代码实际上并不起作用,因为一个单词,比如weevil,将满足字母w的word.count(字母)条件,两个e传递两次,然后在两个e之后再满足三次,这就是为什么它在列表中出现了四次。
也许我从错误的角度来处理这件事,但我真的被如何做到这一点难住了。
发布于 2017-05-14 20:13:56
IIUC你的问题,你可以使用
>>> [w for w in words if len(set(w)) == len(w)]
['cat', 'car', 'lizard']如果一个单词没有重复的字母,那么它的长度将是它的字母集合的长度。剩下的只是把它放到list comprehension中。
发布于 2017-05-14 20:14:21
尝试使用标准库提供的filter功能
words = ['cat', 'car', 'weevil', 'lizard', 'mammoth', 'cabbage', 'aardvaark']
newlist = list( filter(lambda x: unduplicate_letter(x), words) )
def unduplicate_letters(w):
for letter in w:
if w.count(letter) > 1:
return False
return True发布于 2017-05-14 20:21:35
之所以发生这种情况,是因为它在每次检查字母时都会追加单词。在追加单词之前,您应该检查所有字母,因此可以添加一个check变量来查看所有字母是否都通过,然后再追加单词。例如:
words = ['cat', 'car', 'weevil', 'lizard', 'mammoth', 'cabbage', 'aardvaark']
newlist = []
for word in words:
check = 0
for letter in word:
if word.count(letter) > 1:
check = 1
if (check == 0):
newlist.append(word)
print(newlist)输出:
['cat', 'car', 'lizard']https://stackoverflow.com/questions/43963679
复制相似问题