3

これは宿題の質問です。基本は理解しましたが、2 つの並列配列を検索する正しい方法が見つからないようです。

元の質問: 2 つの並列配列を持つプログラムを設計します。7 人の名前で初期化される配列 namedStringと、友人の電話番号で初期化される配列 named です。プログラムは、ユーザーが個人の名前 (または個人の名前の一部) を入力できるようにする必要があります。次に、配列内でその人物を検索する必要があります。その人物が見つかった場合、配列からその人物の電話番号を取得して表示する必要があります。人が見つからない場合、プログラムはそのことを示すメッセージを表示する必要があります。peopleStringphoneNumberspeoplephoneNumbers

私の現在のコード:

# 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."
4

2 に答える 2

6

これは宿題なので、コードをあからさまに与えることは差し控えます。

dict名前をキー、電話番号を値とするルックアップ テーブルとして機能するを作成できます。

ルックアップ テーブルの作成:

dict()andを使用して、並列配列を 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]

名前が部分文字列に一致する人のリスト:

この答えは、あなたを正しい軌道に乗せるはずです。

もちろん、検索で空のリストが返された場合は、一致する名前がなく、適切なメッセージを表示できます。


代替提案

もう 1 つの方法は、リストを直接検索して一致のインデックスを取得し、それを使用して電話番号を取得することです。

この例を提供し、それを実行可能なソリューションに拡張するのはあなたに任せます。

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

途中で問題が発生した場合は、行ったことを共有してください。喜んでお手伝いします。

頑張って楽しんでね。


更新された質問への回答

2 つの代替ソリューションを提供したことに注意してください。1 つは辞書をルックアップ テーブルとして使用し、もう 1 つはリストを直接検索します。あなたの更新は、両方のソリューションを混在させようとしていることを示していますが、これは必要ありません。

すべての名前で部分文字列の一致を検索する必要がある場合は、2 番目の解決策 (リストを直接検索する) を使用する方がよい場合があります。私が提供したコード例は、リストを返します (その部分文字列を含む名前が複数ある可能性があるため) (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
于 2011-10-28T15:08:25.827 に答える
0

への回答は、こちらを参照してくださいHow do I ... return the index of the persons name in the people array

于 2011-10-28T15:18:25.590 に答える