2012-08-03 16 views
3

Я хочу иметь список городов и список почтовых индексов с соответствующими позициями (если NYC является первым в списке городов, код NYS будет первым в списке кодов). Скажем, я хотел установить 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

ответ

7

Если я правильно понимаю, у вас есть два параллельных списков, которые вы хотите, чтобы рассматривать в качестве по существу, список ключей и список значений. Если да, то вы можете сделать что-то вроде следующего:

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

В принципе, возьмите свой список мест, как ключи и ваш список почтовых индексов/почтовые индексы, как ваши ценности, использовать zip, чтобы объединить их в последовательность ключа -value, а затем используйте dict для создания dict, который сопоставляет их друг с другом.

EDIT: А если вы хотите создать словарь другой способ отображения почтовых индексов/застежки-молнии на место, где вы могли бы использовать один и тот же процесс, просто переверните порядок списков в вашем zip. Затем вы могли бы объединить два результирующих диктата в один, если бы вам нужна одна структура, которая могла бы искать. Пока нет места с тем же именем, что и почтовый код, не должно быть никаких столкновений.

+2

Возможно, вы должны использовать '' Austin'' и '' Sacremento'' вместо своих мест ...: ^). – mgilson

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' 
Смежные вопросы