سؤال

السؤال القصير ، هل هناك وظيفة خارجية لصنع رسم بياني من مجموعة من مجموعات 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)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top