Python を使用する前の私のプログラミングのほとんどは、C++ または Matlab で行われていました。私は CS の学位を持っていません (物理学の博士号をほぼ取得しています) が、いくつかのコースを受講し、実際のプログラミングをかなり行っています。今、私は Coursera でアルゴリズムのコースを受講しています (ちなみに、スタンフォード大学の教授による優れたコースです)。宿題を Python で実装することにしました。しかし、言語がそれほど簡単にサポートしていないものが欲しくなることがあります。私は、データをグループ化するためだけに C++ でクラスとオブジェクトを作成することに非常に慣れています (つまり、メソッドがない場合)。ただし、Python では、フィールドをオンザフライで追加できるため、基本的に常に必要になるのは Matlab 構造体です。これはおそらく、私が良いスタイルを使用しておらず、「Pythonic」の方法で物事を行っていないことを示していると思います。
その下には、union-find データ構造の実装 (Kruskal のアルゴリズム用) があります。実装は比較的短く、問題なく動作しますが (エラー チェックはあまり行われません)、奇妙な点がいくつかあります。たとえば、私のコードでは、最初に union-find に渡されたデータがオブジェクトのリストであると想定しています。ただし、代わりに明示的なデータのリスト (つまり、int のリスト) が渡されると、コードは失敗します。これを実装するための、より明確でより Pythonic な方法はありますか? 私はこれをグーグルで検索しようとしましたが、ほとんどの例は非常に単純で、手続き型コード (つまり、Python で for ループを実行する「適切な」方法) に関連しています。
class UnionFind:
def __init__(self,data):
self.data = data
for d in self.data:
d.size = 1
d.leader = d
d.next = None
d.last = d
def find(self,element):
return element.leader
def union(self,leader1,leader2):
if leader1.size >= leader2.size:
newleader = leader1
oldleader = leader2
else:
newleader = leader2
oldleader = leader1
newleader.size = leader1.size + leader2.size
d = oldleader
while d != None:
d.leader = newleader
d = d.next
newleader.last.next = oldleader
newleader.last = oldleader.last
del(oldleader.size)
del(oldleader.last)