从bool列表中删除重复项

时间:2017-06-05 02:41:46

标签: python python-3.x

我想在列表中找到一个单词,后面跟一个带有''。''的单词。例如,如果这是一个列表

test_list = ["hello", "how", "are.", "you"]

它会选择“你”这个词,我已设法将其关闭但我正在努力确保我不会得到重复的单词。 这是我到目前为止所拥有的

list = []
i = 0
bool = False
words = sent.split()
for word in words:
    if bool:
        list.append(word)
        bool = False
   # the bellow if statment seems to make everything worse instead of fixing the duplicate problem
    if "." in word and word not in list:
        bool = True
return list 

4 个答案:

答案 0 :(得分:3)

您可以使用zip()list comprehension

将整个代码简化为此示例
a = ['hello', 'how', 'are.', 'you']

def get_new_list(a):
    return [v for k,v in zip(a, a[1:]) if k.endswith('.')]

然后,要删除重复项,如果有,请使用set(),如下例所示:

final = set(get_new_list(a))

输出:

{'you'}

答案 1 :(得分:2)

这不是基于您发布的代码,但它应该完全符合您的要求。

def getWordAfterDot(words):
    for index, word in enumerate(words):
        if word.endswith('.') and len(words) - index > 1:
            yield words[index + 1]

多次调用此函数将产生后跟句点的单词。

答案 2 :(得分:0)

以下是解决同一问题的不同方法。

import itertools
from collections import deque

t = deque(map(lambda x: '.' in x, test_list)) # create a deque of bools
>>deque([False, False, True, False])

t.rotate(1) # shift it by one since we want the word after the '.'
>>deque([False, False, False, True])

set(itertools.compress(test_list, t)) # and then grab everywhere it is True
>>{'you'}

答案 3 :(得分:0)

itertools配方中,pairwise的定义对于一次迭代列表2非常有用:

def pairwise(iterable):
    a, b = it.tee(iterable)
    next(b, None)
    return a, b

您可以使用它来创建以'.'结尾的单词后面的单词列表:

words = [n for m, n in zip(*pairwise(l)) if m[-1] == '.']

删除重复项:

seen = set()
results = [x for x in words if not (x in seen or seen.add(x))]