在列表之间交换的Pythonic方式?

时间:2012-08-03 19:56:15

标签: python list

我想要一个城市列表和一个邮政编码列表,其中的位置对应(如果NYC在城市列表中排在第一位,NYS的代码将首先在代码列表中)。说我想将x设置为纽约市的邮政编码。我知道可以这样做:

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

但是,有没有办法将列表等同并在一行中执行此操作,例如:

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

5 个答案:

答案 0 :(得分:7)

如果我理解正确,您有两个并行列表,您希望将其视为一个键列表和一个值列表。如果是这样,您可以执行以下操作:

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

基本上,将您的地点列表作为您的密钥以及您的拉链/邮政编码列表作为您的值,使用zip将它们组合成一系列键值对,然后使用{{1}创建将它们相互映射的字典。

编辑:如果您想创建字典,另一种将邮政编码/拉链映射到您可以使用相同流程的地方,只需翻转{{{ 1}}。如果你想要一个可以查找的结构,你可以将两个结果的dicts组合成一个。只要没有与邮政编码同名的地方,就不应该发生冲突。

答案 1 :(得分: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'

答案 2 :(得分:1)

如果您按正确的顺序生成了列表,则可以使用zip一起迭代这些列表:

for city, zipcode in zip(citylist, postcodelist):
  print city, zipcode

答案 3 :(得分:0)

你的意思是这样吗?

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

答案 4 :(得分:0)

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

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