【发布时间】:2013-05-25 09:45:20
【问题描述】:
我这里有这个方法,它以字典的形式生成有向图,其中键的值是键指向的节点,即 {'stack': ['over','flow'] },堆栈指向over and flow...
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
我的问题是,我怎样才能实现集合与字典的使用,以防止与所讨论的键相同的值被添加到键中?
【问题讨论】:
-
为什么要进行深度复制?
-
为什么不在这里测试
if j not in heroList? -
deepcopying 是这样我可以删除一个键,而不是从我使用的主字典中删除键
-
@MartijnPieters 我正在考虑使用它,但我的图表很大,有 100000 多个键,因此在效率方面没有帮助。我想知道是否可以使用集合实现相同的效果,同时不会对效率产生太大影响。
-
如果没有更多关于
heroDict内容的详细信息,我对此不能多说,但看起来简单的graph[j].extend(e for e in i if e != j)就可以了;这也会创建一个新列表。
标签: python dictionary set