簡體   English   中英

Python-嵌套列表匹配

[英]Python - matching on nested list

我有以下代碼;

#!/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)

上面的代碼返回一個空列表[]

本質上,我想做的是創建一個第三個列表,該列表將僅包含唯一值,看起來應該像這樣;

list3 = [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 = [[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]

如果您不想一一通過,請執行以下操作:

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

print(no_dub)

輸出:

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

根據要求更新:

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)

輸出:

['ID1', 'ID2', 'ID3', 'ID6', 'ID4', 'ID5', 'ID7', 'ID14', 'ID8', 'ID9']

首先,您需要從list1list2制作平面列表,制作一個包含list1list2元素的擴展列表,並將結果列表轉換為設置以刪除重復的元素。

我給的解決方案少了一些冗長,涉及的行數也少了

#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()

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

def flatten(lst):
    flattened = []
    for item in lst:
        if isinstance(item, list):
            flattened.extend(flatten(item))
        else:
            flattened.append(item)

    return flattened

print(sorted(list(set(flatten(list1 + list2)))))

哪些輸出:

[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]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM