簡體   English   中英

如何找到兩個列表的每個元素之間的差異,而其中一個不是嵌套列表

[英]How to find the difference between each element of two list while one of them is not a nested list

我正在嘗試編寫一種算法,查找2個列表之間的差異,但是其中之一不是嵌套列表。

例如;

a = [1,2,3,4]
b = [1,[2,3],[3,4]]

預期輸出為

expected = [[2,3,4],[1,4],[1,2]]

所以,我們的目標是,找到a-b1 ,其中b1是在每一個元素b一個接一個。

我試圖將它們轉換為set()frozenset()使用filter()等,但是它們都不成功。 我收到整數錯誤或輸出錯誤(就我而言)。

我的實際目標是拓撲結構,在寫這個算法, a是設置和b是在拓撲a 因此,我正在嘗試編寫該拓撲的封閉集

在真正的問題, ab都是集合,其中b是一個嵌套set ,但我意識到有工作lists是不是更容易sets來實現我的目標,但仍沒有類似我的問題(#2)的答案並不成功。

如何找到given setclosed set ,或者如何找到list1中list2中所有元素的差異,其中list2是嵌套列表,而list1不是。

在使用數學集時,您實際上應該在Python中使用提供的set類型。 我將您的集合寫為Python集合:

a = {1,2,3,4}
b = [{1},{2,3},{3,4}]

注意, b是集合的列表; 您在上a拓撲。 您可以使用-運算符找到集合之間的差異(兩個集合ABAB與數學A\\B ):

res = [a-el for el in b]

輸出:

In [11]: res
Out[11]: [{2, 3, 4}, {1, 4}, {1, 2}]

這是組之間差異的列表

編輯這是一種以所需方式轉換輸入的方法:

首先,提示用戶用括號寫出每個集合,使其具有常規語法,例如: (1),(1,2),(2,3,4)

現在我們需要一個正則表達式來找到結果字符串"(1),(1,2),(2,3,4)"的集合:

import re
inp_list = re.findall(r"(?:\(([\d,]+))", inp_string)

現在我們可以從上面提到的解決方案開始:

res = [{int(number) for number in inp.split(",")} for inp in inp_list]

要了解正則表達式, 請單擊此處

用您的輸入:

a = [1,2,3,4]
b = [1,[2,3],[3,4]]

現在我將a作為set

a = set(a)

然后我要執行ab元素之間a集合差,僅需測試一下該元素是簡單值還是列表。 將每個元素轉換回list或使用sorted以獲得遞增順序。

result = [list(a-(set(be if isinstance(be,list) else [be]))) for be in b]

結果:

[[2, 3, 4], [1, 4], [1, 2]]

小變體,在傳遞非列表時直接創建一個set

result = [list(a-(set(be) if isinstance(be,list) else {be})) for be in b]

和非理解的實現

a = set(a)
result = []
for be in b:
    if isinstance(be,list):
        result.append(list(a-set(be)))
    else:
        result.append(list(a - {be}))

僅適用於“平坦”列表,例如您的示例

您可以使用Frozenset或sets進行此操作

a = {1,2,3,4}    # normal set (mutable)
b = [1,frozenset({2,3}),frozenset({3,4})] # frozenset in list to keep ordering 

c = [ (a-x) if isinstance(x,set) else (a-set([x])) for x in b]

print(c)

輸出:

[set([2, 3, 4]), set([1, 4]), set([1, 2])]

展開清單的組合:

d = []
for top in b:
    d.append( a-top if isinstance(top,set) else a-set([top]) )

# d == c 

a-top只是set.difference的簡寫。 這是集合的速記表(2.7-仍然有效)

我考慮編寫一個自定義方法,該方法返回兩個列表之間的差異:

def difference(w, z):
  [w.remove(x) for x in z if x in w]
  return w

然后在for循環中使用該方法:

res = []
for y in b:
  tmp = a[:]
  if not isinstance(y, list): y = [y]
  res.append(difference(tmp, y))

print(res)
#=> [[2, 3, 4], [1, 4], [1, 2]]


我不知道它是否有用,但在這種情況下:

 a = [1,2,2,3,4] b = [1,[2,3],[3,4],5] 

結果是[[2, 2, 3, 4], [1, 2, 4], [1, 2, 2], [1, 2, 2, 3, 4]]

您可以自定義方法以更好地滿足您的需求。

暫無
暫無

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

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