0

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

文件就是这样开始的。。

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)

在这一点上,我被困在如何访问并弄清楚谁的母亲是谁。我能想到的唯一另一种不太优雅的方法是切换键和值,以拥有一个巨大的行列表,分别标记每个孩子的母亲。

4

2 回答 2

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')

建立一个将孩子映射到他们父母的字典将使查找速度更快。

于 2013-05-18T06:02:28.303 回答
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.')

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

于 2013-05-18T06:45:43.123 回答