如何从两个单独列出获得两个值进行打印(蟒蛇)

问题描述:

这里是我的问题,我有两个不同的列表,列表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

这应该被标记“家庭作业” –

最基本的方法来解决这个问题:

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'吗? –

放在一个字典数据:

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

把它们放进一个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

创建压缩列表的词典:

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

你想要的东西像

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

+0

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

+2

@RikeshPadhiar在这里没有多少意义,但这应该使用zip。 print [y for x,y in zip(a,b)if x =='peter'] – Danny

难道你不能只使用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

我必须用一个列表这个问题

如果您不能使用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