1

我这里有这个方法,它以字典的形式生成有向图,其中键的值是键指向的节点,即 {'stack': ['over','flow']}, stack指向溢出和流...

def generateGraph(fileName):
    heroDict = {}
    graph = {}
    with open(fileName) as inFile:
        for line in inFile:#go through each line
            name_comic = line.rstrip().replace('"', '').split('\t') #split into list with name and comic book as strings
            if name_comic[1] in heroDict: #if the comic book is already in the dictionary
                heroDict[name_comic[1]] += [name_comic[0]] #add the hero into the comic's list of heroes
            else:
                heroDict.update({name_comic[1]: [name_comic[0]]}) # update dictionary with name and comic book
    for i in heroDict.values():
        for j in i:
            if graph.has_key(j):
                tempDict = copy.deepcopy(i)
                tempDict.remove(j)
                heroList = tempDict
                graph[j] += heroList
            else:
                tempDict = copy.deepcopy(i)
                tempDict.remove(j)
                heroList = tempDict
                graph[j] = heroList
        print graph #<========== the graph has duplicates, ie, values that are the same as their keys are present
    return graph

我的问题是,如何实现对字典的集合的使用,以防止将与所讨论的键相同的值添加到键中?

4

1 回答 1

4

这是我重新编码您的图形生成器的方法;使用csv模块collections.defaultdict使代码更具可读性:

import csv
from collections import defaultdict

def generateGraph(fileName):
    heroDict = defaultdict(list)

    with open(fileName, 'rb') as inFile:
        reader = csv.reader(inFile, delimiter='\t')
        for row in reader:
            name, comic = row[:2]
            heroDict[comic].append(name)

    graph = defaultdict(list)
    for names in heroDict.itervalues():
        for name in names:
            graph[name].extend(n for n in names if n != name)
    print graph
    return graph

这里不需要使用集合。请注意,我使用了更有意义的变量名;尽量避免ij除非它们是整数索引。

于 2013-05-25T10:07:03.213 回答