繁体   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