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