Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在大型累积列表中查找较小列表的多个重复_Python_List - Fatal编程技术网

Python 在大型累积列表中查找较小列表的多个重复

Python 在大型累积列表中查找较小列表的多个重复,python,list,Python,List,我有一个很大的字符串列表,例如: full_log = ['AB21','BG54','HG89','NS72','Error','CF54','SD62','KK02','FE34'] tc1 = ['HG89','NS72'] tc2 = ['AB21','BG54'] tc3 = ['KK02','FE34'] tc4 = ['CF54','SD62'] 和多个小字符串列表,例如: full_log = ['AB21','BG54','HG89','NS72','Error','CF5

我有一个很大的字符串列表,例如:

full_log = ['AB21','BG54','HG89','NS72','Error','CF54','SD62','KK02','FE34']
tc1 = ['HG89','NS72']
tc2 = ['AB21','BG54']
tc3 = ['KK02','FE34']
tc4 = ['CF54','SD62']
和多个小字符串列表,例如:

full_log = ['AB21','BG54','HG89','NS72','Error','CF54','SD62','KK02','FE34']
tc1 = ['HG89','NS72']
tc2 = ['AB21','BG54']
tc3 = ['KK02','FE34']
tc4 = ['CF54','SD62']
我想在维护序列的较大列表中找到每个较小的列表,以便输出如下:

tc2-tc1-Er-tc4-tc3
我想知道是否有任何直截了当的、类似蟒蛇的方法来处理这种情况。

您可以使用以下方法进行模式匹配:

from sets import Set
full_log = ['AB21','BG54','HG89','NS72','Error','CF54','SD62','KK02','FE34']

tc1 = ['HG89','NS72']
tc2 = ['AB21','BG54']
tc3 = ['KK02','FE34']
tc4 = ['CF54','SD62']

set(full_log) & set(tc1)
输出:
{'HG89',NS72'}

#Finding index of set elements:

result=set(full_log) & set(tc1)



def all_indices(value, qlist):
    indices = []
    idx = -1
    while True:
        try:
            idx = qlist.index(value, idx+1)
            indices.append(idx)
        except ValueError:
            break
    return indices


r=[]
for i in range(len(result)):
   s=all_indices(list(result)[i], full_log)
   r.append(s)

r
Output: [[2], [3]]
您需要创建小列表中元素的映射(字典):

m = {k: v for k, v in zip(map(tuple, [tc1, tc2, tc3, tc4])), ["tc1", "tc2", "tc3", "tc4"])}
>>> {('KK02', 'FE34'): 'tc3', ('AB21', 'BG54'): 'tc2', ('CF54', 'SD62'): 'tc4', ('HG89', 'NS72'): 'tc1'}
然后可以使用迭代器在列表上循环:

itr=iter(完整日志)
对于itr中的i:
如果我“错误”:
n=下一个(itr)
如果n!=“错误”:
如果(i,n)单位为m:
打印m[(i,n)]
其他:
打印“Er”
其他:
打印“Er”
>>>tc2
tc1
铒
tc4
tc3
如果您不介意扩展第一个列表中的“错误”条目:

full_log2 = [item for sublist in [[i] if i != "Error" else ["Error", "Error"] for i in full_log] for item in sublist]
>>> ['AB21', 'BG54', 'HG89', 'NS72', 'Error', 'Error', 'CF54', 'SD62', 'KK02', 'FE34']
然后您可以使用列表:

print [m[(full_log2[i], full_log2[i+1])] if (full_log2[i], full_log2[i+1]) in m else "Er" for i in range(0, len(full_log2)-1, 2)]
>>> ['tc2', 'tc1', 'Er', 'tc4', 'tc3']

如果所有短列表长度相等,您可以创建一个
dict
,其中键是字符串的
tuple
,值是其中一个标签。您可以浏览
full_log
,取一个长度合适的块,看看是否可以从
dict
中找到它

如果短列表的长度不同,上述方法将不起作用,因为从
full\u log
获取的块长度不是常数。在这种情况下,一种可能的解决方案是将短列表中的项目添加到树结构中,其中叶节点是一个标签。然后针对
full_log
中的每个索引,查看是否可以从树中找到路径。如果找到路径,请将其长度向前跳转,否则请从下一个索引尝试:

from collections import defaultdict
from itertools import islice

full_log = ['AB21','BG54','HG89','NS72','Error','CF54','SD62','KK02','FE34']

# Construct a tree
dd = lambda: defaultdict(dd)
labels = defaultdict(dd)
labels['HG89']['NS72'] = 'tc1'
labels['AB21']['BG54'] = 'tc2'
labels['KK02']['FE34'] = 'tc3'
labels['CF54']['SD62'] = 'tc4'

# Find label, return tuple (label, length) or (None, 1)
def find_label(it):
    length = 0
    node = labels
    while node and isinstance(node, dict):
        node = node.get(next(it, None))
        length += 1

    return node, (length if node else 1)

i = 0
result = []
while i < len(full_log):
    label, length = find_label(islice(full_log, i, None))
    result.append(label if label else full_log[i])
    i += length

print result # ['tc2', 'tc1', 'Error', 'tc4', 'tc3']
从集合导入defaultdict
从itertools导入islice
完整日志=['AB21'、'BG54'、'HG89'、'NS72'、'Error'、'CF54'、'SD62'、'KK02'、'FE34']
#建树
dd=lambda:defaultdict(dd)
标签=默认DICT(dd)
标签['HG89']['NS72']='tc1'
标签['AB21']['BG54']='tc2'
标签['KK02']['FE34']='tc3'
标签['CF54']['SD62']='tc4'
#查找标签,返回元组(标签,长度)或(无,1)
def查找标签(it):
长度=0
节点=标签
而node和isinstance(node,dict):
node=node.get(下一个(它,无))
长度+=1
返回节点(如果节点为1,则长度为1)
i=0
结果=[]
而i

上面使用的树有点例外,节点可以包含子节点或值(标签)。

非常感谢您的回复。我已经考虑过了,但是集合的问题是它不能保持顺序。如果你能找到所有集合元素的索引呢?我已经编辑了我的答案。请原谅我的无知,所有的索引都是一个内置函数?我很抱歉,我忘了在回答中添加函数定义谢谢:),第二个解决方案适合我的目的。我喜欢这种方法。使用我从未想到的图形:)这很酷:)。。。非常感谢…我喜欢它的简单性…希望它能起作用。如果较小列表中的元素数量较少,效果会很好。在我的例子中,较小的列表有近200个元素,而较大的列表有近5000个元素。你对这种情况有什么建议吗?我喜欢@niemmi的方法,但希望能有更简单的方法。