![](/img/trans.png)
[英]How to find the lowest difference between two numbers from the given list in python using nested while loop?
[英]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
。 因此,我正在嘗試編寫該拓撲的封閉集 。
在真正的問題, a
和b
都是集合,其中b
是一個嵌套set
,但我意識到有工作lists
是不是更容易sets
來實現我的目標,但仍沒有類似我的問題(#2)的答案並不成功。
如何找到given set
的closed set
,或者如何找到list1中list2中所有元素的差異,其中list2是嵌套列表,而list1不是。
在使用數學集時,您實際上應該在Python中使用提供的set
類型。 我將您的集合寫為Python集合:
a = {1,2,3,4}
b = [{1},{2,3},{3,4}]
注意, b
是集合的列表; 您在上a
拓撲。 您可以使用-
運算符找到集合之間的差異(兩個集合A
和B
, AB
與數學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)
然后我要執行a
與b
元素之間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.