Проверьте, есть ли строка в списке, в зависимости от двух последних символов

Настроить

Я использую Scrapy для очистки объявлений о жилье. На объявление я получаю почтовый код, который состоит из четырех чисел, за которыми следуют 2 буквы, например 1053ZM .

У меня есть лист Excel, связывающий районы с почтовыми кодами следующим образом,

 district postcode_min postcode_max A 1011AB 1011BD A 1011BG 1011CE A 1011CH 1011CZ 

Итак, во второй строке указано, что почтовые индексы от 1011AB, 1011AC,..., 1011AZ, 1011BA,...,1011BD относятся к округу A

Фактический список содержит 1214 строк.


проблема

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

Я не уверен, что было бы лучшим способом сделать это, и как это сделать.

Я придумал два разных подхода:

  1. Создайте все почтовые индексы между postcode_min и postcode_max , назначьте все почтовые индексы и их соответствующие округа в словарь, чтобы впоследствии совместить с использованием цикла.

Т.е. создавать,

  d = {'A': ['1011AB','1011AC',...,'1011BD', '1011BG','1011BH',...,'1011CE', '1011CH','1011CI',...,'1011CZ'], 'B': [...], } 

а потом,

 found = False for distr in d.keys(): # loop over districts for code in d[distr]: # loop over district's postal codes if postal_code in code: # assign if ad's postal code in code district = distr found = True break else: district = 'unknown' if found: break 
  1. Подумайте, что Python понимает, что существует диапазон между postcode_min и postcode_max , назначать диапазоны и их соответствующие районы для словаря и сопоставлять их с помощью цикла.

Т.е. что-то вроде,

 d = {'A': [range(1011AB,1011BD), range(1011BG,1011CE),range(1011CH,1011CZ)], 'B': [...] } 

а потом,

 found = False for distr in d.keys(): # loop over districts for range in d[distr]: # loop over district's ranges if postal_code in range: # assign if ad's postal code in range district = distr found = True break else: district = 'unknown' if found: break 

вопросы

Для подхода 1:

  • Как создать все почтовые коды и назначить их в словаре?

Для подхода 2:

Я использовал range() для пояснительной цели, но я знаю, что range() не работает так.

  • Что мне нужно для эффективного использования range() как в приведенном выше примере?
  • Как правильно перебрать эти диапазоны?

Я думаю, что мое предпочтение лежит в подходе 2, но я рад работать с одним из них. Или с другим решением, если оно у вас есть.

2 Solutions collect form web for “Проверьте, есть ли строка в списке, в зависимости от двух последних символов”

Вы можете просто собирать значения в excel, как это

 d = {'A': ['1011AB', '1011BD', '1011BG', '1011CE', '1011CH', '1011CZ'], 'B': ['1061WB', '1061WB'], } def is_in_postcode_range(current_postcode, min, max): return min <= current_postcode <= max def get_district_by_post_code(postcode): for district, codes in d.items(): first_code = codes[0] last_code = codes[-1] if is_in_postcode_range(postcode, first_code, last_code): if any(is_in_postcode_range(postcode, codes[i], codes[i+1]) for i in range(0, len(codes), 2)): return district else: return None 

Применение:

 print get_district_by_post_code('1011AC'): A print get_district_by_post_code('1011BE'): None print get_district_by_post_code('1061WB'): B 

Вы можете использовать интервал для достижения намного лучшей скорости поиска и интерпретировать почтовый индекс как число в базе 36 (10 цифр и 26 букв).

 from intervaltree import IntervalTree t = IntervalTree() for district,postcode_min,postcode_max in your_district_table: # We read the postcode as a number in base 36 postcode_min = int(postcode_min, 36) postcode_max = int(postcode_max, 36) t[postcode_min:postcode_max] = district 

Если почтовые индексы включены (включая почтовый индекс «max»), используйте вместо этого:

  t[postcode_min:postcode_max+1] = district 

Наконец, вы можете искать районы по post_code следующим образом:

 def get_district(post_code): intervals = t[int(post_code, 36)] if not intervals: return None # I assume you have only one district that matches a postal code return intervals[0][2] # The value of the first interval on the list 
  • Согласованность порядка Dict / Set Parsing
  • Что такое объект сопоставления, в соответствии с типом dict?
  • Используйте dicts как элементы в наборе в Python
  • Массив Python со строковыми индексами
  • Python словарь, который отображает строки в набор строк?
  • Каков наилучший способ реализации вложенных словарей?
  • Преобразование значений dict в набор при сохранении dict
  • Сравнение 2 списков, состоящих из словарей с уникальными ключами в python
  • Python - лучший язык программирования в мире.