从 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) 并输出
List_ar=[1,3,4], List_br=[0,2]
如果两个列表相等,我将得到两个空列表作为输出。
我一直在尝试逐个元素(“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:]将多余的元素追加回原本较长的列表