假设我们有两套:
t = {('b', 3), ('a', 2)}
r = {('b', 4), ('c', 6)}
我希望第一个元素上的联合导致
u = {('b', 3), ('a', 2), ('c', 6)}
如果两个地方都存在重复的符号(例如上面的例子'b'),那么应该保留第一个列表的元素。谢谢。
做就是了:
t = {('b', 3), ('a', 2)}
r = {('b', 4), ('c', 6)}
d = dict(r)
d.update(t)
u = set(d.items())
print(u)
输出:
{('c', 6), ('a', 2), ('b', 3)}
有点短版本:
s = dict((*r, *t))
set(s.items())
输出:
{('a', 2), ('b', 3), ('c', 6)}
for el in r:
if not el[0] in [x[0] for x in t]:
t.add(el)
t
{('a', 2), ('b', 3), ('c', 6)}
你不能用set intersecion做到这一点。两个对象要么相等,要么不对。由于你的对象是元组,(b, 3)
和(b, 4)
不相等,你不能改变它。
显而易见的方法是创建自己的类并重新定义相等,例如
class MyTuple:
def __init__(self, values):
self.values = values
def __eq__(self, other):
return self.values[0] == other[0]
并创建这样的对象集。
使用chain的替代方案:
from itertools import chain
t = {('b', 3), ('a', 2)}
r = {('b', 4), ('c', 6)}
result = set({k: v for k, v in chain(r, t)}.items())
产量
{('b', 3), ('a', 2), ('c', 6)}
这是我基于理解的单行式解决方案:
t = {('b', 3), ('a', 2)}
r = {('b', 4), ('c', 6)}
result = {*t, *{i for i in r if i[0] not in {j[0] for j in t}}}
print(result) # {('b', 3), ('a', 2), ('c', 6)}
使用转换到字典来消除重复,你也可以这样做,这是一个非常聪明的解决方案恕我直言:
t = {('b', 3), ('a', 2)}
r = {('b', 4), ('c', 6)}
result = {(k,v) for k,v in dict((*r,*t)).items()}
print(result) # {('b', 3), ('a', 2), ('c', 6)}