是否可以合并两个集合,使所有对两个集合的引用都引用新的集合?

2024-09-30 18:20:45 发布

您现在位置:Python中文网/ 问答频道 /正文

在Python中,假设我有两个集合A和B,以及对这两个集合的多个引用。在

是否有方法合并a和B两个集合,使得对这两个集合的所有引用都将引用新合并的集合?如果可能,运行时间是什么?在

A = {1,3}
B = {2,4}
aRef1 = A
aRef2 = A
bRef1 = B
bRef2 = B
MergeSets(A,B)
# Now, whenever I use any of (A, B, aRef1, aRef2, bRef1, bRef2) 
# they refer to the same set which will be {1,2,3,4} 

谢谢你

编辑:

有人一直在问我为什么要这么做,下面是我的一个回复的复制/粘贴:

So I know I can do A.update(B), to merge B into A, but then I'd have to iterate through all references to B and set them to refer to A. I was asking so I can avoid these extra iterations. I could supply more context to get a new approach to my specific scenario, but I'm more curious to know if this is possible in python as a general case.

此外,我的问题似乎已经得到了回答,而结论是这是不可能的。再次感谢大家:)


Tags: to方法more时间cannowbutknow
3条回答

给予:

A = {1,3}
B = {2,4}
aRef1 = A
aRef2 = A
bRef1 = B
bRef2 = B

如果希望所有六个对象都引用同一个集合而不是同一个对象:

^{pr2}$

如果要使用mergeList函数将所有六个对象都引用同一个集而不是同一个对象:

def mergeList(A, B):
    A |= B
    B |= A

mergeList(A, B)
print(A, id(A))
print(aRef1, id(aRef1))
print(aRef2, id(aRef2))
print(B, id(B))
print(bRef1, id(bRef1))
print(bRef2, id(bRef2))


#{1, 2, 3, 4} 2668549913736 (1°object)
#{1, 2, 3, 4} 2668549913736 (1°object)
#{1, 2, 3, 4} 2668549913736 (1°object)
#{1, 2, 3, 4} 2668549967944 (2°object)
#{1, 2, 3, 4} 2668549967944 (2°object)
#{1, 2, 3, 4} 2668549967944 (2°object)

如果希望所有六个对象都引用同一个集合,同一个对象

A |= B
B = A
bRef1 = B
bRef2 = B

print(A, id(A))
print(aRef1, id(aRef1))
print(aRef2, id(aRef2))
print(B, id(B))
print(bRef1, id(bRef1))
print(bRef2, id(bRef2))


#{1, 2, 3, 4} 2538372611208 (same object)
#{1, 2, 3, 4} 2538372611208 (same object)
#{1, 2, 3, 4} 2538372611208 (same object)
#{1, 2, 3, 4} 2538372611208 (same object)
#{1, 2, 3, 4} 2538372611208 (same object)
#{1, 2, 3, 4} 2538372611208 (same object)

使用mergeList会让所有变量引用同一个对象有点棘手

根据你所做的分配,他们目前都在引用各自的集合A或{}。例如,bRef1

id(B)
# 112140097128

id(bRef1)
# 112140097128

原始的set是否通过修改新集合进行修改取决于您执行的操作类型。如果执行就地操作,例如:

^{pr2}$

然后检查原始变量B,可以看到它确实已经更新:

print(B)
# {2, 4, 5}

但是,当合并两个集时,除非同时执行在位操作并因此显式更新其中一个集,否则将创建一个新对象:

new_set = aRef2 | bRef2

id(new_set)
# 112140098248

但是,如果您通过合并其中一个集合AB与另一个集合合并来更新它们,假设开始使用2不同的对象,则无法将其更改为引用同一对象的所有集。在

将参数作为引用传递给函数,因此不能将参数作为参数传递给函数。另一种方法是改变传递给函数的对象。在

In [35]: A = {1,3}
    ...: B = {2,4}
    ...: aRef1 = A
    ...: aRef2 = A
    ...: bRef1 = B
    ...: bRef2 = B

In [36]: def merge_sets(a, b):
    ...:     for el in b:
    ...:         a.add(el)
    ...:     for el in a:
    ...:         b.add(el)

In [37]: merge_sets(A, B)

In [38]: [id(s) for s in (A, B, aRef1, aRef2, bRef1, bRef2)]
Out[38]:
[140333907731848,
 140333907731176,
 140333907731848,
 140333907731848,
 140333907731176,
 140333907731176]

In [39]: [s for s in (A, B, aRef1, aRef2, bRef1, bRef2)]
Out[39]:
[{1, 2, 3, 4},
 {1, 2, 3, 4},
 {1, 2, 3, 4},
 {1, 2, 3, 4},
 {1, 2, 3, 4},
 {1, 2, 3, 4}]

merge_sets以线性时间执行。在

相关问题 更多 >