这是一个家庭作业问题,我掌握了基础知识,但我似乎找不到搜索两个并行数组的正确方法。
原题:设计一个程序,有两个并行数组:一个String
数组名为people
,初始化为七个人的名字,一个String
数组名为phoneNumbers
,初始化为你朋友的电话号码。程序应该允许用户输入一个人的名字(或名字的一部分)。然后它应该在people
数组中搜索那个人。如果找到了这个人,它应该从phoneNumbers
数组中获取这个人的电话号码并显示它。如果找不到人,程序应该显示一条提示信息。
我的当前代码:
# create main
def main():
# take in name or part of persons name
person = raw_input("Who are you looking for? n> ")
# convert string to all lowercase for easier searching
person = person.lower()
# run people search with the "person" as the parameters
peopleSearch(person)
# create module to search the people list
def peopleSearch(person):
# create list with the names of the people
people = ["john",
"tom",
"buddy",
"bob",
"sam",
"timmy",
"ames"]
# create list with the phone numbers, indexes are corresponding with the names
# people[0] is phoneNumbers[0] etc.
phoneNumbers = ["5503942",
"9543029",
"5438439",
"5403922",
"8764532",
"8659392",
"9203940"]
现在,我的整个问题从这里开始。如何对姓名进行搜索(或部分搜索),并返回people数组中人名的索引,并相应地打印电话号码?
更新:我把这个添加到代码的底部,以便进行搜索。
lookup = dict(zip(people, phoneNumbers))
if person in lookup:
print "Name: ", person ," nPhone:", lookup[person]
但这只适用于完全匹配,我尝试使用这个来获得部分匹配。
[x for x in enumerate(people) if person in x[1]]
但是当我在'tim'
上搜索它时,它返回[(5, 'timmy')]
。我如何获得5
的索引并将其应用于print phoneNumbers[
从搜索 ]
返回的索引?
更新2:终于让它工作完美。使用此代码:
# conduct a search for the person in the people list
search = [x for x in enumerate(people) if person in x[1]]
# for each person that matches the "search", print the name and phone
for index, person in search:
# print name and phone of each person that matches search
print "Name: ", person , "nPhone: ", phoneNumbers[index]
# if there is nothing that matches the search
if not search:
# display message saying no matches
print "No matches."
由于这是作业,我将避免直接给出代码。
您可以创建一个dict
,它作为查找表,以名称作为键,以电话号码作为值。
创建查找表:
您可以使用dict()
和zip()
轻松地将并行数组转换为字典。类似以下语句:
lookup = dict(zip(people, phoneNumbers))
要了解它是如何工作的,请看下面的例子:
>>> people = ["john", "jacob", "bob"]
>>> phoneNumbers = ["5503942", "8659392", "8659392"]
>>> zip(people, phoneNumbers)
[('john', '5503942'), ('jacob', '8659392'), ('bob', '8659392')]
>>> dict(zip(people, phoneNumbers))
{'jacob': '8659392', 'bob': '8659392', 'john': '5503942'}
查找某人是否存在:
您可以使用以下命令快速确定查找表中是否存在一个人(键):
if name in lookup:
# ... phone number will be lookup[name]
姓名与子字符串匹配的人员列表:
这个答案会让你走上正确的道路。
当然,如果搜索返回一个空列表,则没有匹配的名称,您可以显示相应的消息。
选择建议
另一种方法是直接搜索列表并获得匹配项的索引,然后可以使用该索引检索电话号码。
我给你这个例子,让你把它扩展成一个可行的解决方案。
>>> people = ["john", "jacob", "bob", "jacklyn", "cojack", "samantha"]
>>> [x for x in enumerate(people) if "jac" in x[1]]
[(1, 'jacob'), (3, 'jacklyn'), (4, 'cojack')]
如果你遇到了困难,分享你所做的,我们很乐意帮助你。
祝你好运,玩得开心
对更新后问题的回复
请注意,我提供了两种替代解决方案,一种使用字典作为查找表,另一种直接搜索列表。你的更新表明你试图将两种解决方案混合在一起,这是不必要的。
如果需要在所有名称中搜索子字符串匹配,则最好使用第二种解决方案(直接搜索列表)。我提供的代码示例返回一个列表(因为可能有多个名称包含该子字符串),每个项都是(index, name)
的元组。您需要遍历列表并提取索引和名称。然后可以使用索引检索电话号码。
为了避免只给你解决方案,这里有一个相关的例子:
>>> people = ["john", "jacob", "bob", "jacklyn", "cojack", "samantha"]
>>> matches = [x for x in enumerate(people) if "jac" in x[1]]
>>> for index, name in matches:
... print index, name
...
1 jacob
3 jacklyn
4 cojack
>>> matches = [x for x in enumerate(people) if "doesnotexist" in x[1]]
>>> if not matches:
... print "no matches"
...
no matches
您可能想在这里寻找How do I ... return the index of the persons name in the people array
的答案。