为什么我的代码不断抛出 KeyError?
Why does my code keep throwing a KeyError?
我这辈子都弄不明白为什么我的代码会抛出 KeyError。我觉得值应该在那里 - 我将它们全部添加到第一个 for loop
中,并且我添加它们的列表不为空(我已经检查过打印语句)。那么为什么第 54 行不停地抛出 KeyError 呢?我敢肯定我只是忽略了一些东西,但是经过一整天的工作后,我陷入了困境。
使用的函数(graph(),和shortest_path()等)是here。
edgeData 具有以下结构:
{string value: [list of string values that are groupings of the values in the dictionary's keys]}
tagUsers 具有以下结构:
{string value: [grouped lists of string values found in edgeData]}
提前致谢。
from collections import defaultdict, deque
import json
class Graph(object):
def __init__(self):
self.nodes = set()
self.edges = defaultdict(list)
self.distances = {}
def add_node(self, value):
self.nodes.add(value)
def add_edge(self, from_node, to_node, distance):
self.edges[from_node].append(to_node)
self.edges[to_node].append(from_node)
self.distances[(from_node, to_node)] = distance
def dijkstra(graph, initial):
visited = {initial: 0}
path = {}
nodes = set(graph.nodes)
while nodes:
min_node = None
for node in nodes:
if node in visited:
if min_node is None:
min_node = node
elif visited[node] < visited[min_node]:
min_node = node
if min_node is None:
break
nodes.remove(min_node)
current_weight = visited[min_node]
for edge in graph.edges[min_node]:
try:
weight = current_weight + graph.distances[(min_node, edge)]
except:
continue
if edge not in visited or weight < visited[edge]:
visited[edge] = weight
path[edge] = min_node
return visited, path
def shortest_path(graph, origin, destination):
visited, paths = dijkstra(graph, origin)
full_path = deque()
_destination = paths[destination]
while _destination != origin:
full_path.appendleft(_destination)
_destination = paths[_destination]
full_path.appendleft(origin)
full_path.append(destination)
return visited[destination]
if __name__ == '__main__':
edgeData = {'a': ['c', 'd'], 'b': ['d'], 'c': ['d'], 'd': ['a', 'b']}
tagUsers = {'hashtag1': ['a', 'c', 'd'], 'hashtag2': ['b'], 'hashtag3': ['b', 'd']}
shortestpaths = {}
graph = Graph()
users = []
# calls function, builds graph with data in edgeData
for key, value in edgeData.items():
users.append(key)
graph.add_node(key)
for each in value:
graph.add_edge(key, each, 1)
# determines how many users used each hashtag
hashtags = {}
for key, value in tagUsers.items():
tmpTags = key
count = len(value)
hashtags[key] = count
# normally determines which hashtag was used the most
# Here, it's pre-set
topTag = ['hashtag1']
# calculates the shortest path from each user to another user
# that uses the most-used hashtag
count = 0
if count < 1:
for key, value in edgeData.items():
tmpDict = {}
for tag in topTag:
shortest = 10000
for k, v in tagUsers.items():
if k == tag:
for each in v:
flag = False
if key != each
flag = True
tmpShort = shortest_path(graph, key, each)
if tmpShort < shortest:
shortest = tmpShort
if flag:
tmpDict[tag] = shortest
shortestpaths[key] = tmpDict
count += 1
目标是 shortestpaths
中的数据包含,对于每个用户,
与使用热门话题标签的另一个用户的最短距离
函数调用引用此代码,由 mdsrosa 在 github 上提供。
具体来说,错误被抛出在 shortest_path()
at `_destination = paths[_destination]
向 shortest_path
添加一些日志记录显示问题:
def shortest_path(graph, origin, destination):
print 'shortest_path Origin:%s Destination:%s' % (origin, destination)
visited, paths = dijkstra(graph, origin)
full_path = deque()
print 'paths: %s' % paths
_destination = paths[destination]
结果:
shortest_path Origin:a Destination:a
paths: {'c': 'a', 'b': 'd', 'd': 'a'}
Traceback (most recent call last):
File "e.py", line 43, in <module>
tmpShort = dj.shortest_path(graph, key, each)
File "E:\kiribati\dijkstra.py", line 61, in shortest_path
_destination = paths[destination]
KeyError: 'a'
您需要处理出发地和目的地相同的极端情况
一个选项是在调用 shortest_path
之前添加检查 if key == each
for k, v in tagUsers.items():
if k == tag:
for each in v:
if key == each:
continue
tmpShort = dj.shortest_path(graph, key, each)
if tmpShort < shortest:
shortest = tmpShort
tmpDict[tag] = shortest
同时将循环变量从 k
、v
、key
、value
、each
更改为描述实际数据的内容
我这辈子都弄不明白为什么我的代码会抛出 KeyError。我觉得值应该在那里 - 我将它们全部添加到第一个 for loop
中,并且我添加它们的列表不为空(我已经检查过打印语句)。那么为什么第 54 行不停地抛出 KeyError 呢?我敢肯定我只是忽略了一些东西,但是经过一整天的工作后,我陷入了困境。
使用的函数(graph(),和shortest_path()等)是here。
edgeData 具有以下结构:
{string value: [list of string values that are groupings of the values in the dictionary's keys]}
tagUsers 具有以下结构:
{string value: [grouped lists of string values found in edgeData]}
提前致谢。
from collections import defaultdict, deque
import json
class Graph(object):
def __init__(self):
self.nodes = set()
self.edges = defaultdict(list)
self.distances = {}
def add_node(self, value):
self.nodes.add(value)
def add_edge(self, from_node, to_node, distance):
self.edges[from_node].append(to_node)
self.edges[to_node].append(from_node)
self.distances[(from_node, to_node)] = distance
def dijkstra(graph, initial):
visited = {initial: 0}
path = {}
nodes = set(graph.nodes)
while nodes:
min_node = None
for node in nodes:
if node in visited:
if min_node is None:
min_node = node
elif visited[node] < visited[min_node]:
min_node = node
if min_node is None:
break
nodes.remove(min_node)
current_weight = visited[min_node]
for edge in graph.edges[min_node]:
try:
weight = current_weight + graph.distances[(min_node, edge)]
except:
continue
if edge not in visited or weight < visited[edge]:
visited[edge] = weight
path[edge] = min_node
return visited, path
def shortest_path(graph, origin, destination):
visited, paths = dijkstra(graph, origin)
full_path = deque()
_destination = paths[destination]
while _destination != origin:
full_path.appendleft(_destination)
_destination = paths[_destination]
full_path.appendleft(origin)
full_path.append(destination)
return visited[destination]
if __name__ == '__main__':
edgeData = {'a': ['c', 'd'], 'b': ['d'], 'c': ['d'], 'd': ['a', 'b']}
tagUsers = {'hashtag1': ['a', 'c', 'd'], 'hashtag2': ['b'], 'hashtag3': ['b', 'd']}
shortestpaths = {}
graph = Graph()
users = []
# calls function, builds graph with data in edgeData
for key, value in edgeData.items():
users.append(key)
graph.add_node(key)
for each in value:
graph.add_edge(key, each, 1)
# determines how many users used each hashtag
hashtags = {}
for key, value in tagUsers.items():
tmpTags = key
count = len(value)
hashtags[key] = count
# normally determines which hashtag was used the most
# Here, it's pre-set
topTag = ['hashtag1']
# calculates the shortest path from each user to another user
# that uses the most-used hashtag
count = 0
if count < 1:
for key, value in edgeData.items():
tmpDict = {}
for tag in topTag:
shortest = 10000
for k, v in tagUsers.items():
if k == tag:
for each in v:
flag = False
if key != each
flag = True
tmpShort = shortest_path(graph, key, each)
if tmpShort < shortest:
shortest = tmpShort
if flag:
tmpDict[tag] = shortest
shortestpaths[key] = tmpDict
count += 1
目标是 shortestpaths
中的数据包含,对于每个用户,
与使用热门话题标签的另一个用户的最短距离
函数调用引用此代码,由 mdsrosa 在 github 上提供。
具体来说,错误被抛出在 shortest_path()
at `_destination = paths[_destination]
向 shortest_path
添加一些日志记录显示问题:
def shortest_path(graph, origin, destination):
print 'shortest_path Origin:%s Destination:%s' % (origin, destination)
visited, paths = dijkstra(graph, origin)
full_path = deque()
print 'paths: %s' % paths
_destination = paths[destination]
结果:
shortest_path Origin:a Destination:a
paths: {'c': 'a', 'b': 'd', 'd': 'a'}
Traceback (most recent call last):
File "e.py", line 43, in <module>
tmpShort = dj.shortest_path(graph, key, each)
File "E:\kiribati\dijkstra.py", line 61, in shortest_path
_destination = paths[destination]
KeyError: 'a'
您需要处理出发地和目的地相同的极端情况
一个选项是在调用 shortest_path
if key == each
for k, v in tagUsers.items():
if k == tag:
for each in v:
if key == each:
continue
tmpShort = dj.shortest_path(graph, key, each)
if tmpShort < shortest:
shortest = tmpShort
tmpDict[tag] = shortest
同时将循环变量从 k
、v
、key
、value
、each
更改为描述实际数据的内容