我有一个程序,它编写一个包含名称和一些查询的文本文件。前四行首先定义左边的父母形象和结肠后的孩子;如果你愿意,可以把它想象成一棵家谱。练习要求我们使用词典来帮助解决这个问题。
这是文件开始的方式..
test_file = open('relationships.txt', 'w')
test_file.write('''Sue: Chad, Brenda, Harris
Charlotte: Tim
Brenda: Freddy, Alice
Alice: John, Dick, Harry
mother Sue
mother Charlotte
mother Brenda
mother Dick
''')
test_file.close()
输出应为..
Mother not known
Mother not known
Sue
Alice
我不确定如何创建此mother
查询,以查看该子项属于哪个母亲。我尝试了一些诸如......之类的东西。
parents = {}
for line in lines[0:4]:
parent, child = line.strip().split(':')
if parent in parents:
parents[parent] += str(child)
else:
parents[parent] = str(child)
print(parents)
关于如何访问并找出谁的母亲是谁,我一直困在这一点上。我能想到的唯一另一种不那么优雅的方式就是切换键和值,以便有一个巨大的行列表,分别标记每个孩子的母亲。
答案 0 :(得分:3)
你应该保留一个孩子的列表,而不是一个字符串:
for line in lines[0:4]:
parent, child = line.strip().split(':')
if parent in parents:
parents[parent].append(child)
else:
parents[parent] = [child]
现在,您可以迭代父母,只检查一个特定的孩子:
child = 'Peter'
for parent, children in parents.items():
if child in children:
print('Mother is', parent)
break
else:
print('Mother not known')
构建一个将子项映射到父项的字典可以使查找更快。
答案 1 :(得分:2)
要实际解决使用词典的问题:
parentchild_map = {}
for line in lines:
if ':' not in line:
continue
mother, multichildren = line.split(':')
children = multichildren.strip().split(', ')
parentchild_map[mother] = children
然后你可以检查这样的匹配:
for parent, children in parentchild_map.items():
if child in children:
print ("Mother is ", parent)
break
else:
print ('Mother not known.')
(编辑:在上面的代码中添加了“break”)
为了使查找更快,您可以提前生成反向字典
reversemap = {}
for parent, children in parentchild_map.items():
for child in children:
reversemap[child] = parent
然后你就可以去了:
mother = reversemap.get(child)
if mother:
print ('Mother is ', mother)
else:
print ('Mother unknown.')
无论您选择哪种查询算法,第一个或第二个查询算法,我希望您将其放入接受“子”参数的函数中,这样您就可以轻松地根据需要执行任意数量的查询。