在python中使用给定的分隔符将列表拆分为子列表

在python中使用给定的分隔符将列表拆分为子列表,python,list,split,divide,Python,List,Split,Divide,我正在尝试建立不跨越句号的n-gram。Split()仅适用于函数,list[index]仅适用于索引。有没有办法通过给列表一个字符串/一个元素来访问/拆分/划分列表?以下是我当前函数的一个片段: text = ["split","this","stuff",".","my","dear"] def generate_ngram(rawlist, ngram_order): """ Input: List of words or characters, ngra

我正在尝试建立不跨越句号的n-gram。Split()仅适用于函数,list[index]仅适用于索引。有没有办法通过给列表一个字符串/一个元素来访问/拆分/划分列表?以下是我当前函数的一个片段:

text = ["split","this","stuff",".","my","dear"]

def generate_ngram(rawlist, ngram_order):
        """
        Input: List of words or characters, ngram-order ["this", "is", "an", "example"], 2
        Output: Set of tuples or words or characters {("this", "is"),("is","an"),...}
        """

    list_of_tuples = []
    for i in range(0, len(rawlist) - ngram_order + 1):
        ngram_order_index = i + ngram_order    
        generated_ngram = rawlist[i : ngram_order_index]

        #if "." in generated_ngram:
            #generated_ngram . . . 

        generated_tuple = tuple(generated_ngram)  
        list_of_tuples.append(generated_tuple)

    return set(list_of_tuples)

generate_ngram(text,3)
目前返回:

{('.', 'my', 'dear'),
 ('stuff', '.', 'my'),
 ('split', 'this', 'stuff'),
 ('this', 'stuff', '.')}
但理想的回报应该是:

{('split', 'this', 'stuff'),
 ('this', 'stuff', '.')}

你知道如何实现这一目标吗?谢谢你的帮助

我不确定这是否正是您所需要的,但此函数生成的NGRAM在结尾只能包含停止字(在本例中为句点):

STOPWORDS = {"."}

def generate_ngram(rawlist, ngram_order):
    # All ngrams
    ngrams = zip(*(rawlist[i:] for i in range(ngram_order)))
    # Generate only those ngrams that do not contain stop words before the end
    return (ngram for ngram in ngrams if not any(w in STOPWORDS for w in ngram[:-1]))

text = ["split", "this", "stuff", ".", "my", "dear"]
print(*generate_ngram(text, 3), sep="\n")
# ('split', 'this', 'stuff')
# ('this', 'stuff', '.')
print(*generate_ngram(text, 2), sep="\n")
# ('split', 'this')
# ('this', 'stuff')
# ('stuff', '.')
# ('my', 'dear')
注意:此函数返回一个生成器。如果需要,您可以将其转换为一个列表,用
list(…)
将其包装起来,也可以直接对其进行迭代

编辑:您可能会发现下面的等效语法更具可读性

def generate_ngram(rawlist, ngram_order):
    # Iterate over all ngrams
    for ngram in zip(*(rawlist[i:] for i in range(ngram_order))):
        # Yield only those not containing stop words before the end
        if not any(w in STOPWORDS for w in ngram[:-1]):
            yield ngram

我不确定这是否正是您所需要的,但此函数生成的NGRAM只能在末尾包含停止字(在本例中为句点):

STOPWORDS = {"."}

def generate_ngram(rawlist, ngram_order):
    # All ngrams
    ngrams = zip(*(rawlist[i:] for i in range(ngram_order)))
    # Generate only those ngrams that do not contain stop words before the end
    return (ngram for ngram in ngrams if not any(w in STOPWORDS for w in ngram[:-1]))

text = ["split", "this", "stuff", ".", "my", "dear"]
print(*generate_ngram(text, 3), sep="\n")
# ('split', 'this', 'stuff')
# ('this', 'stuff', '.')
print(*generate_ngram(text, 2), sep="\n")
# ('split', 'this')
# ('this', 'stuff')
# ('stuff', '.')
# ('my', 'dear')
注意:此函数返回一个生成器。如果需要,您可以将其转换为一个列表,用
list(…)
将其包装起来,也可以直接对其进行迭代

编辑:您可能会发现下面的等效语法更具可读性

def generate_ngram(rawlist, ngram_order):
    # Iterate over all ngrams
    for ngram in zip(*(rawlist[i:] for i in range(ngram_order))):
        # Yield only those not containing stop words before the end
        if not any(w in STOPWORDS for w in ngram[:-1]):
            yield ngram

您的输出中出现了许多不在列表中的单词。请回顾您的示例,并尝试进一步解释您希望它做什么。函数中的文档似乎表明您正在尝试构建n-grams。但是,您所期望的输出具有不同的大小。是否要生成不跨越句点符号的n-grams?@jdehesa,感谢您的建议。我试图修改我的文档。对不起,第一次在这里发帖!是的,我的意思是构建不跨越句点符号/句子边界的n-gram。在您的输出中出现了许多不在列表中的单词。请回顾您的示例,并尝试进一步解释您希望它做什么。函数中的文档似乎表明您正在尝试构建n-grams。但是,您所期望的输出具有不同的大小。是否要生成不跨越句点符号的n-grams?@jdehesa,感谢您的建议。我试图修改我的文档。对不起,第一次在这里发帖!是的,我的意思是构建不跨越句点符号/句子边界的n-gram。这正是我所需要的!“太谢谢你了!”丽莎很高兴这有帮助。我添加了一个语法变体,您可能会发现它更具可读性。如果你觉得答案已经解决了,请考虑把答案标记为“接受”。注意,顺便说一下,这个方法假设输入是一个序列,比如一个列表或元组,如果它是另一种iterable,比如生成器,那么
zip(*(rawlist[i:]表示范围内的i(ngram_order))
将不起作用-您可以寻找该行的替代品。这正是我需要的!“太谢谢你了!”丽莎很高兴这有帮助。我添加了一个语法变体,您可能会发现它更具可读性。如果你觉得答案已经解决了,请考虑把答案标记为“接受”。注意,顺便说一句,该方法假设输入是一个序列,如列表或元组,如果它是另一种iterable,如生成器,则
zip(*(rawlist[i:]表示范围内的i(ngram_order))
不起作用-您可以寻找该行的替代方案。