2011-11-22 42 views
1

這裏是我的問題,我有兩個不同的列表,列表a其中包含的人與名單b其中包含他們的電話號碼的名字:如何從兩個單獨列出獲得兩個值進行打印(蟒蛇)

a = ["peter", "bob", "john", "jack"] 
b = ["8954 3434", "8999 4432", "8976 5443", "8990 3331"] 

我需要做的是提示用戶輸入一個名稱爲a的名稱,然後python應該自動從列表b中打印出該人的電話號碼。

我碰到這似乎很有趣代碼:

for x, y in zip(a, b): 
    print x, y 

這幾乎打印每一個名字和它旁邊的相應的電話號碼,基本上是我需要的,但不是從列表中的每個名稱一個出現,我需要的是用戶能夠輸入一個單一的名稱和名稱的電話號碼顯示出來。

只是爲了澄清,使用上面的代碼給我的輸出:

peter 8954 3434 
bob 8999 4432 
john 8976 5443 
jack 8990 3331 

雖然我要的是用戶能夠輸入一個名稱,如「彼得」,這應該給輸出:

peter 8954 3434 

有沒有辦法編輯上面的代碼讓事情正常工作?謝謝你的幫助。

+0

嗯我被告知「要同時循環兩個或更多的序列,條目可以與zip()函數配對」,所以我假設一個zip函數是要走的路。索引似乎工作正常,所以我猜這裏沒有問題,但真的沒有辦法讓這個工作使用zip(),以便我有兩個不同的方法呢? – JimmyK

+2

這應該被標記「家庭作業」 –

回答

2

最基本的方法來解決這個問題:

who = raw_input("Give a name") 
for name, number in zip(a, b): 
    if name == who: 
     print name, number 

我希望這是作業。

+0

這似乎工作得最好,非常感謝。 :D – JimmyK

+0

@RikeshPadhiar:把這個和你的問題中基本的'for ... zip()'例子比較一下 - 你不能自己弄清楚'if'嗎? –

4

放在一個字典數據:

>>> phone_numbers['john'] 
'8976 5443' 

如果你想這樣做,只使用列表,你可以使用index

>>> a = ["peter", "bob", "john", "jack"] 
>>> b = ["8954 3434", "8999 4432", "8976 5443", "8990 3331"] 
>>> phone_numbers = dict(zip(a,b)) 

然後,你可以從他們的名字找人的電話號碼但請注意,這將有不佳的表現:

b[a.index('john')] 
'8976 5443' 
+0

如果兩個人有相同的名字,這不會有問題嗎? – Danny

+0

就像我上面說過的,我必須使用這個問題的列表 – JimmyK

+0

感謝索引作品,但如果可能我想使用zip()函數 – JimmyK

0

把它們放進一個dictiona RY:

people = dict(zip(a, b)) 

然後就看名字了:

name = "john" 
print("%s's number is %s" % (input, people[name])) 
+0

問題是我必須使用一個列表,這就是爲什麼這是如此棘手。 xD – JimmyK

+0

爲什麼你必須使用一個列表?這是功課嗎? – Kevin

+0

這個問題出現在過去的考試中,所以我必須知道如何做到這一點,以防萬一它再次出現 – JimmyK

0

創建壓縮列表的詞典:

names = ["peter", "bob", "john", "jack"] 
phones = ["8954 3434", "8999 4432", "8976 5443", "8990 3331"] 
phones_by_name = dict(zip(names, phones)) 
print "bob", phones_by_name["bob"] 
print "jack", phones_by_name["jack"] 

給出:

bob 8999 4432 
jack 8990 3331 
+0

是否有沒有辦法讓它工作,但列表而不是字典? – JimmyK

2

你想要的東西像

print b[a.index("bob")] 

+0

感謝它的作品,但如果可能我想使用zip()函數 – JimmyK

+2

@RikeshPadhiar在這裏沒有多少意義,但這應該使用zip。 print [y for x,y in zip(a,b)if x =='peter'] – Danny

0

難道你不能只使用if陳述嗎?

for x, y in zip(a, b): 
    if x == name_input: 
     print x, y 

或者我想在你的代碼

for name, phone in zip(names_list, phone_list): 
    if name == name_input: 
     print name, phone 

的情況下,但你應該告訴你的老師使用dict

1

我必須用一個列表這個問題

如果您不能使用phone = dict(zip(a,b)).get("peter")然後使用list comprehensions

phones = [phone for name, phone in zip(a,b) if name == "peter"] 

它返回"peter"的電話號碼列表。它允許你有幾個同名的條目。如果列表很大,那麼它比dict方法(O(1) vs. O(N))慢得多。

如果你只需要一個,然後使用next()號:

phone = next((phone for name, phone in zip(a,b) if name == "peter"), None) 

它返回列表中的第一個匹配。 phoneNone如果列表中沒有這樣的名稱。

+0

感謝它運作良好。 – JimmyK