2012-08-03 42 views
3

我想要列出城市和邮政编码列表,并且对应的位置(如果纽约市首先在城市列表中,纽约州的代码将首先在代码列表中)。假设我想将x设置为NYC的邮政编码。我知道这是可能做到这一点:列表之间交换的Pythonic方式?

y = citylist.index('New York') 
x = postcodelist[y] 
xstring = str(x) 

但是,有没有办法等同名单,并在一行做到这一点,如:

x = postcodelist.citylist.index('New York').string 
+3

为什么不使用双向词典吗? 'd = {'纽约':00101,00101:'纽约'}'。查找会容易很多... – mgilson 2012-08-03 19:58:21

回答

7

如果我理解正确的话,你必须要为处理两个平行的列表基本上是一个键列表和值列表。如果是这样,你可以这样做以下:

>>> places = ['New York', 'Texas', 'California'] 
>>> zips = ['01010', '70707', '90909'] 
>>> place_zip_map = dict(zip(places, zips)) 
>>> place_zip_map['New York'] 
'01010' 

基本上,把你的地方作为你的钥匙,你的拉链/邮政编码作为值列表列表,使用zip将它们组合成键的顺序 - 值对,然后使用dict创建将它们映射到另一个的词典。

编辑:如果你想创建一个字典的其他方式邮政编码/拉链映射到你可以使用相同的过程的地方,只需拨动你zip列表的顺序。如果你想要一个可以查看的结构,那么你可以将这两个结果的结果合并成一个。只要没有与邮政编码同名的地方,就不应有冲突。

+2

也许你应该在你的地方使用''Austin''和''Sacremento''来代替......:^)。 – mgilson 2012-08-03 20:00:24

0

你的意思是这样吗?

x = str(postcodelist[citylist.index('New York')]) 
1

如果你已经在正确的顺序,你可以使用zip通过他们在一起,迭代产生的名单:

for city, zipcode in zip(citylist, postcodelist): 
    print city, zipcode 
0
str(postcodelist[citylist.index('New York')]) 

但是,我会注意到你可能想要考虑不使用这样的并行列表。通常更好的办法是使用'name'和'zip'属性的对象列表。

4

你可以使用pyzipcode

>>> from pyzipcode import ZipCodeDatabase 
>>> zcdb = ZipCodeDatabase() 
>>> zcdb['10001'].city 
u'New York' 
>>> len(zcdb.find_zip(city="New York")) 
167 
>>> zcdb.find_zip(city="New York")[0].zip 
u'10001' 
>>> zcdb.find_zip(city="New York")[1].zip 
u'10002' 
>>> zcdb.find_zip(city="New York")[2].zip 
u'10003'