从 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:]
将多余的元素追加回原本较长的列表
我对 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:]
将多余的元素追加回原本较长的列表