Python:元组集合的联合

问题描述 投票:2回答:6

假设我们有两套:

t = {('b', 3), ('a', 2)}
r = {('b', 4), ('c', 6)}

我希望第一个元素上的联合导致

u = {('b', 3), ('a', 2), ('c', 6)}

如果两个地方都存在重复的符号(例如上面的例子'b'),那么应该保留第一个列表的元素。谢谢。

python python-3.x
6个回答
6
投票

做就是了:

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)}

2
投票

有点短版本:

s = dict((*r, *t))
set(s.items())

输出:

{('a', 2), ('b', 3), ('c', 6)}

1
投票
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)}

0
投票

你不能用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]

并创建这样的对象集。


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)}

0
投票

这是我基于理解的单行式解决方案:

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)}
© www.soinside.com 2019 - 2024. All rights reserved.