基于嵌套列表的Python匹配

基于嵌套列表的Python匹配,python,list,loops,for-loop,Python,List,Loops,For Loop,我有以下代码 #!/usr/bin/python list1 = [[1,1,1,2], 2, [1,2,3,6], 3, 4, 5] list2 = [1,1, [6,7], 7, 14 , 8, 9] list3 = [] def check_match(l1,l2): for i in l1: if type(i) is list: check_match(i,l2) for j in l2: i

我有以下代码

#!/usr/bin/python

list1 = [[1,1,1,2], 2, [1,2,3,6], 3, 4, 5]
list2 = [1,1, [6,7], 7, 14 , 8, 9]
list3 = []


def check_match(l1,l2):
    for i in l1:
        if type(i) is list:
            check_match(i,l2)
        for j in l2:
            if type(j) is list:
                check_match(l1,j)
            else:
                if i == j:
                    list3.append(i)

print(list3)
上述代码返回一个空列表[]

基本上,我要做的是创建一个第三个列表,其中只包含唯一的值,如下所示

清单3=[1,2,3,4,5,6,7,8,9,14]

如果有人能指导我,那就太好了


谢谢大家

你们在找这样的东西吗

list1 = [[1,1,1,2], 2, [1,2,3,6], 3, 4, 5]
list2 = [1,1, [6,7], 7, 14 , 8, 9]


no_dub=[]
def checker(lst):
    if not lst:
        return 0
    else:
        for i in lst:
            if isinstance(i,list):
                for k in i:
                    if k not in no_dub:
                        no_dub.append(k)

            else:
                if i not in no_dub:
                    no_dub.append(i)

            return checker(lst[1:])

checker(list1)
checker(list2)
print(no_dub)
输出:

[1, 2, 3, 6, 4, 5, 7, 14, 8, 9]
[1, 2, 3, 6, 4, 5, 7, 14, 8, 9]
['ID1', 'ID2', 'ID3', 'ID6', 'ID4', 'ID5', 'ID7', 'ID14', 'ID8', 'ID9']
如果你不想一个接一个地通过,那么:

check_all=[list1,list2]
for i in check_all:
    checker(i)

print(no_dub)
输出:

[1, 2, 3, 6, 4, 5, 7, 14, 8, 9]
[1, 2, 3, 6, 4, 5, 7, 14, 8, 9]
['ID1', 'ID2', 'ID3', 'ID6', 'ID4', 'ID5', 'ID7', 'ID14', 'ID8', 'ID9']
根据要求更新:

list1 = [[1,1,1,2], 2, [1,2,3,6], 3, 4, 5]
list2 = [1,1, [6,7], 7, 14 , 8, 9]


no_dub=[]
def checker(lst):
    if not lst:
        return 0
    else:
        for i in lst:
            if isinstance(i,list):
                for k in i:
                    if "ID{}".format(k) not in no_dub:
                        no_dub.append("ID{}".format(k))

            else:
                if "ID{}".format(i) not in no_dub:
                    no_dub.append("ID{}".format(i))

            return checker(lst[1:])

check_all=[list1,list2]
for i in check_all:
    checker(i)

print(no_dub)
输出:

[1, 2, 3, 6, 4, 5, 7, 14, 8, 9]
[1, 2, 3, 6, 4, 5, 7, 14, 8, 9]
['ID1', 'ID2', 'ID3', 'ID6', 'ID4', 'ID5', 'ID7', 'ID14', 'ID8', 'ID9']

你在找这样的东西吗

list1 = [[1,1,1,2], 2, [1,2,3,6], 3, 4, 5]
list2 = [1,1, [6,7], 7, 14 , 8, 9]


no_dub=[]
def checker(lst):
    if not lst:
        return 0
    else:
        for i in lst:
            if isinstance(i,list):
                for k in i:
                    if k not in no_dub:
                        no_dub.append(k)

            else:
                if i not in no_dub:
                    no_dub.append(i)

            return checker(lst[1:])

checker(list1)
checker(list2)
print(no_dub)
输出:

[1, 2, 3, 6, 4, 5, 7, 14, 8, 9]
[1, 2, 3, 6, 4, 5, 7, 14, 8, 9]
['ID1', 'ID2', 'ID3', 'ID6', 'ID4', 'ID5', 'ID7', 'ID14', 'ID8', 'ID9']
如果你不想一个接一个地通过,那么:

check_all=[list1,list2]
for i in check_all:
    checker(i)

print(no_dub)
输出:

[1, 2, 3, 6, 4, 5, 7, 14, 8, 9]
[1, 2, 3, 6, 4, 5, 7, 14, 8, 9]
['ID1', 'ID2', 'ID3', 'ID6', 'ID4', 'ID5', 'ID7', 'ID14', 'ID8', 'ID9']
根据要求更新:

list1 = [[1,1,1,2], 2, [1,2,3,6], 3, 4, 5]
list2 = [1,1, [6,7], 7, 14 , 8, 9]


no_dub=[]
def checker(lst):
    if not lst:
        return 0
    else:
        for i in lst:
            if isinstance(i,list):
                for k in i:
                    if "ID{}".format(k) not in no_dub:
                        no_dub.append("ID{}".format(k))

            else:
                if "ID{}".format(i) not in no_dub:
                    no_dub.append("ID{}".format(i))

            return checker(lst[1:])

check_all=[list1,list2]
for i in check_all:
    checker(i)

print(no_dub)
输出:

[1, 2, 3, 6, 4, 5, 7, 14, 8, 9]
[1, 2, 3, 6, 4, 5, 7, 14, 8, 9]
['ID1', 'ID2', 'ID3', 'ID6', 'ID4', 'ID5', 'ID7', 'ID14', 'ID8', 'ID9']

我建议使用递归将列表展平,然后使用集合:

def flatten(s, target=int): 
   if type(s) == target:
       yield s
   else:
      for i in s:
         for b in flatten(i):
            yield b

list1 = [[1,1,1,2], 2, [1,2,3,6], 3, 4, 5]
list2 = [1,1, [6,7], 7, 14 , 8, 9]
final_result = list(set([*list(flatten(list1)), *list(flatten(list2))]))
输出:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 14]

我建议使用递归将列表展平,然后使用集合:

def flatten(s, target=int): 
   if type(s) == target:
       yield s
   else:
      for i in s:
         for b in flatten(i):
            yield b

list1 = [[1,1,1,2], 2, [1,2,3,6], 3, 4, 5]
list2 = [1,1, [6,7], 7, 14 , 8, 9]
final_result = list(set([*list(flatten(list1)), *list(flatten(list2))]))
输出:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 14]

您首先需要从
list1
list2
中创建一个平面列表,创建一个包含
list1
list2
两个元素的扩展列表,并将结果列表强制转换为删除重复元素

我给出的解决方案不那么冗长,涉及的行数也更少

#Flatten list function
flatten=lambda l: sum(map(flatten,l),[]) if isinstance(l,list) else [l]
list1 = flatten(list1) #[1, 1, 1, 2, 2, 1, 2, 3, 6, 3, 4, 5]
list2 = flatten(list2) #[1, 1, 6, 7, 7, 14, 8, 9]
list1.extend(list2) #[1, 1, 1, 2, 2, 1, 2, 3, 6, 3, 4, 5, 1, 1, 6, 7, 7, 14, 8, 9]
list(set(list1))
#[1, 2, 3, 4, 5, 6, 7, 8, 9, 14]

您首先需要从
list1
list2
中创建一个平面列表,创建一个包含
list1
list2
两个元素的扩展列表,并将结果列表强制转换为删除重复元素

我给出的解决方案不那么冗长,涉及的行数也更少

#Flatten list function
flatten=lambda l: sum(map(flatten,l),[]) if isinstance(l,list) else [l]
list1 = flatten(list1) #[1, 1, 1, 2, 2, 1, 2, 3, 6, 3, 4, 5]
list2 = flatten(list2) #[1, 1, 6, 7, 7, 14, 8, 9]
list1.extend(list2) #[1, 1, 1, 2, 2, 1, 2, 3, 6, 3, 4, 5, 1, 1, 6, 7, 7, 14, 8, 9]
list(set(list1))
#[1, 2, 3, 4, 5, 6, 7, 8, 9, 14]

您可以创建一个函数来展平列表,然后将结果转换为
set()

哪些产出:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 14] 

您可以创建一个函数来展平列表,然后将结果转换为
set()

哪些产出:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 14] 

我还建议将其展平,然后使用set,但当我完成编码时,看到了几乎相同的答案。然而,我会这样做:

list1 = [[1,1,1,2], 2, [1,2,3,6], 3, 4, 5]
list2 = [1,1, [6,7], 7, 14 , 8, 9]
l = list1+list2
flatList = []
for e in l:
    if type(e) == list:
        flatList.extend(e)
    else:
        flatList.append(e)
list(set(flatList))
结果:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 14]

我还建议将其展平,然后使用set,但当我完成编码时,看到了几乎相同的答案。然而,我会这样做:

list1 = [[1,1,1,2], 2, [1,2,3,6], 3, 4, 5]
list2 = [1,1, [6,7], 7, 14 , 8, 9]
l = list1+list2
flatList = []
for e in l:
    if type(e) == list:
        flatList.extend(e)
    else:
        flatList.append(e)
list(set(flatList))
结果:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 14]

在最后一个请求之后,最好的方法是在i的值之前附加一个字符串,以便输出读取;[ID1,ID2,ID3,ID6,ID4,ID5,ID7,ID14,ID8,ID9]谢谢mate@ik_tech检查更新的解决方案,我已经编辑了答案。@ik_tech或者一旦你得到列表3,你就可以对列表3中的e执行
['ID'+str(e)]
。这会将ID合并到列表中每个元素的前面。@FatihAkici当我们可以通过同一个循环执行此操作时,为什么还要添加其他循环?感谢各位-与Aydohyankit发布的解决方案相比,扁平化有什么好处吗?一旦最后一次请求,在i值之前添加字符串以便输出读取的最佳方法是什么;[ID1,ID2,ID3,ID6,ID4,ID5,ID7,ID14,ID8,ID9]谢谢mate@ik_tech检查更新的解决方案,我已经编辑了答案。@ik_tech或者一旦你得到列表3,你就可以对列表3中的e执行
['ID'+str(e)]
。这会将ID合并到列表中每个元素的前面。@FatihAkici当我们可以通过同一个循环进行此操作时,为什么还要添加循环?谢谢各位-与Aydohyankit发布的解决方案相比,扁平化有什么好处吗?