【问题标题】:modifying elements of array in python在python中修改数组的元素
【发布时间】:2013-01-21 05:18:31
【问题描述】:

我试图实现一个(天真的)quick_find_union,如下所示

class QF(object):
    def __init__(self,N):
        self.id=[x for x in range(N)]
    def connected(self,p,q):
        assert type(p)==int
        assert type(q)==int
        return self.id[p]==self.id[q]

    def union(self,p,q):
        assert type(p)==int
        assert type(q)==int
        for x in self.id:
            pid=self.id[p]
            qid=self.id[q]
            if x==pid:
                x=qid
#        for i in range(len(self.id)):
#            pid=self.id[p]
#            qid=self.id[q]
#            if self.id[i]==pid:
#                self.id[i]=qid

    def show_array(self):
        print self.id

if __name__=='__main__':
    qf=QF(10)
    qf.show_array()
    print qf.connected(1,4)
    qf.union(1,4)
    qf.show_array()
    print qf.connected(1,4)

这会返回

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
False
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
False

但是当我只使用方法联合中的注释掉部分时 ,它按预期工作

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
False
[0, 4, 2, 3, 4, 5, 6, 7, 8, 9]
True

为什么会这样?它与尝试在迭代时修改数组元素有关吗?我不是很清楚。。有人可以解释一下吗?

【问题讨论】:

    标签: python algorithm iteration


    【解决方案1】:

    x=qid 只需将名称 x 重新绑定到名称 qid 所指的对象。它不会修改self.id 列表中的元素。

    使用enumerate()获取索引和值,并使用索引更新self.id列表:

    for i, x in enumerate(self.id):
        pid=self.id[p]
        qid=self.id[q]
        if x==pid:
            self.id[i]=qid
    

    【讨论】:

      猜你喜欢
      • 2017-01-04
      • 2021-12-16
      • 2015-10-13
      • 2018-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-04
      相关资源
      最近更新 更多