بناء رسم بياني من نوع مجموعة Python
سؤال
السؤال القصير ، هل هناك وظيفة خارجية لصنع رسم بياني من مجموعة من مجموعات Python؟ السؤال الأطول: لدي العديد من مجموعات بيثون. كل منها يتداخل أو بعض مجموعات فرعية من الآخرين. أرغب في صنع رسم بياني (كما هو الحال في العقد والحواف) هي العناصر في المجموعات. الحواف تقاطع المجموعات مع مرجح عدد العناصر في تقاطع المجموعات. هناك العديد من حزم الرسوم البيانية لبيثون. (NetworkX ، Igraph ، ...) لست على دراية باستخدام أي منها. هل سيقوم أي منهم بعمل رسم بياني مباشرة من قائمة مجموعات IE ، Makegraphfromsets (AlistofSets) إذا لم تكن تعرف مثالًا على كيفية أخذ قائمة المجموعات لتحديد الحواف. يبدو في الواقع أنه قد يكون مستقيمًا للأمام ولكن مثال على ذلك دائمًا.
المحلول
ليس من الصعب للغاية ترميز نفسك:
def intersection_graph(sets):
adjacency_list = {}
for i, s1 in enumerate(sets):
for j, s2 in enumerate(sets):
if j == i:
continue
try:
lst = adjacency_list[i]
except KeyError:
adjacency_list[i] = lst = []
weight = len(s1.intersection(s2))
lst.append( (j, weight) )
return adjacency_list
أرقام هذه الوظيفة كل مجموعة مع فهرسها داخل sets
. نحن نفعل ذلك لأن مفاتيح التصوير يجب أن تكون غير قابلة للتغيير ، وهذا صحيح في الأعداد الصحيحة ولكن ليس مجموعات.
إليك مثال على كيفية استخدام هذه الوظيفة ، وإخراجها:
>>> sets = [set([1,2,3]), set([2,3,4]), set([4,2])]
>>> intersection_graph(sets)
{0: [(1, 2), (2, 1)], 1: [(0, 2), (2, 2)], 2: [(0, 1), (1, 2)]}
نصائح أخرى
def MakeGraphfromSets(sets):
egs = []
l = len(sets)
for i in range(l):
for j in range(i,l):
w = sets[i].intersection(sets[j])
egs.append((i,j,len(w)))
return egs
# (source set index,destination set index,length of intersection)
sets = [set([1,2,3]), set([2,3,4]), set([4,2])]
edges = MakeGraphfromSets(sets)
for e in edges:
print e
انتاج:
(0, 0, 3)
(0, 1, 2)
(0, 2, 1)
(1, 1, 3)
(1, 2, 2)
(2, 2, 2)