利用Python词典

时间:2013-05-18 05:57:51

标签: python python-3.x

我有一个程序,它编写一个包含名称和一些查询的文本文件。前四行首先定义左边的父母形象和结肠后的孩子;如果你愿意,可以把它想象成一棵家谱。练习要求我们使用词典来帮助解决这个问题。

这是文件开始的方式..

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)

关于如何访问并找出谁的母亲是谁,我一直困在这一点上。我能想到的唯一另一种不那么优雅的方式就是切换键和值,以便有一个巨大的行列表,分别标记每个孩子的母亲。

2 个答案:

答案 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.')

无论您选择哪种查询算法,第一个或第二个查询算法,我希望您将其放入接受“子”参数的函数中,这样您就可以轻松地根据需要执行任意数量的查询。