如何在Python中将实例列表同步到原始实例列表?

时间:2019-05-23 18:04:48

标签: python list instance

我有一个数据管理器类,其中包含数据实例的原始列表。我也有一个GUI类,其中包含每个这些实例的GUI元素。事件发生时,我需要将GUI列表与原始列表同步。

我觉得有一个比遍历两个列表到append()和remove()特定实例更好,更优雅的解决方案。

编辑:一个例子就是

class Foo:
    def __init__(self, name='default'):
        self.name = name

    def __repr__(self):
        return self.name


a = Foo(name='a')
b = Foo(name='b')
c = Foo(name='c')
d = Foo(name='d')

l_original = [a, b]
l_synced = [a, b, c]

在这种情况下,我需要一种算法来确保l_synced与l_original 相同,而无需设置l_synced = l_original。

2 个答案:

答案 0 :(得分:0)

我会在GUI模型中保留对数据实例的引用。然后,当事件发生时,我将遍历所有GUI实例,并使用引用回到实际数据实例上,在该数据实例上调用诸如delete()modify()等相关方法。另外,我还将传递一个对某种Factory()类的引用,该类可以为负责添加元素的GUI元素创建数据模型的新实例。

答案 1 :(得分:0)

一个示例,用于确保l_syncedl_original相同,而未设置l_synced = l_original。它使用添加和删除。希望它能对您有所帮助。

class Foo:
    def __init__(self, name='default'):
        self.name = name

    def __repr__(self):
        return self.name


a = Foo(name='a')
b = Foo(name='b')
c = Foo(name='c')
d = Foo(name='d')

l_original = [a, b]
l_synced = [a, b, c]

print("Before")
print("Original: %s" % l_original)
print("Synced: %s" % l_synced)

for sync_obj in l_synced:
    if sync_obj in l_original:
        print("%s in l_original" % sync_obj)
    else:
        print("%s NOT in l_original. Remove it." % sync_obj)
        l_synced.remove(sync_obj)

for orig_obj in l_original:
    if orig_obj in l_synced:
        print("%s in l_synced" % orig_obj)
    else:
        print("%s NOT in l_synced. Append it." % orig_obj)
        l_synced.sppend(orig_obj)

print("After")
print("Original: %s" % l_original)
print("Synced: %s" % l_synced)

输出:

>>>python loop.py 
Before
Original: [a, b]
Synced: [a, b, c]
a in l_original
b in l_original
c NOT in l_original. Remove it.
a in l_synced
b in l_synced
After
Original: [a, b]
Synced: [a, b]