在Python中搜索并行数组

时间:2011-10-28 14:56:25

标签: python arrays parallel-arrays

这是一个功课问题,我把基础知识搞定了,但我似乎无法找到正确的搜索两个并行数组的方法。

原始问题:设计一个包含两个并行数组的程序:名为String的{​​{1}}数组,其初始化名称为7个人,并且{{1用你朋友的电话号码初始化名为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"]

但是当我在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

更新2:最后让它完美运行。使用此代码:

print phoneNumbers[

2 个答案:

答案 0 :(得分:6)

由于这是作业,我将不会直接提供代码。

您可以创建一个dict作为查找表,其名称为密钥,电话号码为其值。

创建查找表:

您可以使用dict()zip()轻松地将并行数组转换为dict。有点像:

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]

名称与子字符串匹配的人员列表:

This answer应该让你走上正轨。

当然,如果搜索返回一个空列表,则没有匹配的名称,您可以显示相应的消息。


替代建议

另一种方法是直接搜索列表并获取匹配的索引,然后您可以使用它来检索电话号码。

我将为您提供此示例,并由您将其扩展为可行的解决方案。

>>> people = ["john", "jacob", "bob", "jacklyn", "cojack", "samantha"]
>>> [x for x in enumerate(people) if "jac" in x[1]] 
[(1, 'jacob'), (3, 'jacklyn'), (4, 'cojack')]

如果你遇到困难,分享你所做的事情,我们很乐意提供帮助。

祝你好运,玩得开心。


对更新问题的回应

请注意,我提供了两种替代解决方案,一种使用dict作为查找表,另一种直接搜索列表。您的更新表明您正在尝试将两种解决方案混合在一起,这是不必要的。

如果您需要搜索子字符串匹配的所有名称,您可能最好使用第二种解决方案(直接搜索list)。我提供的代码示例返回一个列表(因为可能有多个名称包含该子字符串),每个项目都是(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 。您需要遍历列表并提取索引和名称。然后,您可以使用索引来检索电话号码。

为了避免给你解决方案,这里有相关的例子:

{{1}}

答案 1 :(得分:0)

您可能希望查看here以获取How do I ... return the index of the persons name in the people array的答案。