[英]remove pairs of equal elements from two lists in sympy
我對 Sympy 很陌生(運行 Python 3)。
給定兩個整數列表,通常長度不相等且其元素可能重復,我需要消除兩個列表之間的所有相等元素對。 例如,給定
List_a=[1, 2, 3, 4, 4], List_b=[0, 2, 2, 4]
我將消除對 (2,2) 和 (4,4) 和 output
List_ar=[1,3,4], List_br=[0,2]
如果兩個列表相等,我將得到兩個空列表 output。
我一直在嘗試逐個元素(“for”和“while”循環)比較列表,當發現相等時從兩個列表中刪除該對。 在此基礎上重復減少列表的過程,直到沒有刪除。 但是缺少“轉到”控件我不知道如何處理可變長度列表。
感謝您的幫助。
如果您將它們轉換為multiset
,您可以比較常用鍵的數量:
>>> from sympy.utilities.iterables import multiset
>>> ma = multiset(lista)
>>> mb = multiset(listb)
>>> for k in set(ma) & set(mb):
... n = min(ma[k],mb[k])
... ma[k] -= n
... mb[k] -= n
...
>>> lista = [i for k in ma for i in [k]*ma[k]]
>>> listb = [i for k in mb for i in [k]*mb[k]]
您也可以將其視為合並排序,但上面是直接的。
一個通用的Python解決方案:
def g(a, b):
def ensure2(xs):
ys = [list(x) for x in xs]
if ys == []:
return [[], []]
else:
return ys
n = min(len(a), len(b))
c, d = ensure2(
zip(*
filter(lambda x: x[0] != x[1],
zip(a, b))))
return c + a[n:], d + b[n:]
a = [1,2,3,4,4]
b = [0,2,2,4]
c = [0,2,2,4]
d = []
# two different lists
ar, br = g(a, b)
print(ar) # [1, 3, 4]
print(br) # [0, 2]
# two identical lists
br, cr = g(b, c)
print(br) # []
print(cr) # []
# one empty list
ar, dr = g(a, d)
print(ar) # [1, 2, 3, 4, 4]
print(dr) # []
zip()
創建對filter()
刪除具有相等元素的對zip(*...)
將剩余的對拆分回兩個列表ensure2()
防止空列表+ list[n:]
將 append 個多余的元素變回原本較長的列表
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.