根据字符串序列将列表分组到子列表中

时间:2017-08-08 22:46:46

标签: python itertools

我需要根据文本文件中存在的字符串序列将列表拆分为子列表,如下所示(请注意,子列表可能不会重叠,并且您不能拥有作为另一个子集的模式)

Patterns:
cat,dog
dog,cow

list = ['chicken','cat','dog','dog','cow','bat']

Output: [chicken,[cat,dog],[dog,cow],bat]

当然,我可以使用一些列表拆分以原生方式执行此操作并在最后再次合并(请参阅edit2)但这很难看,我认为必须有更多的pythonic方法来执行此操作。有一些类似的问题使用itertools或类似的问题,但它们都不是我想要的(它们主要涉及匹配一个共同的特征,这里不存在)。

编辑:列表项可以多次出现(因此模式可能会多次出现)。模式还可以包含任意数量的元素> 1

编辑2:以下是我正在考虑的原生方法。请注意,我没有实现这一点,它很可能有几个问题(包括我没有插入第二个for循环中的正确索引),但我认为它演示了我最初想到的算法。

l1 = input list
list l2 = [100]  #Just preseting the size for now
for pattern in patterns:
    find(index where pattern starts in l1)
    s = split list (start of pattern:end of pattern)
    list[start of pattern] = s
for l in l2:
    if l2[l] is empty:
        l2[l] = l1[l]

1 个答案:

答案 0 :(得分:1)

以下似乎符合您的要求,它使用else循环可选的for子句来处理没有模式匹配的情况(并且当前元素应该被复制)到result)。

patterns = ['cat', 'dog'], ['dog', 'cow']
elements = ['chicken', 'cat', 'dog', 'dog', 'cow', 'bat']

result = []
i = 0
while i < len(elements):
    for pattern in patterns:
        if pattern == elements[i: i+len(pattern)]:
            result.append(pattern)
            i += len(pattern)
            break
    else:
        result.append(elements[i])
        i += 1

print(result)  # -> ['chicken', ['cat', 'dog'], ['dog', 'cow'], 'bat']