簡體   English   中英

從 sympy 中的兩個列表中刪除相等元素對

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

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