2016-08-08 3 views
0

私は、会社が大規模(〜5,000 /日)で住所を整理し、ジオコードするために使用しているプログラムを開発しました。それは十分に機能していますが、毎日私が問題を引き起こしている特定のアドレス形式があります。条件付きで文字列内の単語の位置を変更する

このような形式のアドレスはpark avenue 1で、私のジオコーディングで問題を引き起こしています。次のようにこの問題に取り組むために私の思考プロセスは、次のとおりです。

  1. スプリットリスト
  2. へのアドレスは、リスト内の私の区切り単語のインデックスを検索します。区切り文字は、avenue, street, road, etcなどの単語です。私はpatternsと呼ばれるこれらの区切り文字のリストを持っています。
  3. デリミタの直後の単語が長さ4以下の数字で構成されているかどうかを確認してください。番号の長さが4より大きい場合は、郵便番号になる可能性があります。これは必要ありません。それが4より小さい場合は、おそらく家の番号になります。
  4. 単語が前の手順で説明した条件を満たす場合は、リストの最初の位置に移動する必要があります。
  5. 最後に、リストをまとめて文字列にします。ここで

コードに私の考えを置くことで私の最初の試みである:

patterns ['my list of delimiters'] 
address = 'park avenue 1' # this is an example address 
address = address.split(' ') 
for pattern in patterns: 
    location = address.index(pattern) + 1 
    if address[location].isdigit() and len(address[location]) <= 4: 
     # here is where i'm getting a bit confused 
     # what would be a good way to go about moving the word to the first position in the list 
address = ' '.join(address) 

任意の助けをいただければ幸いです。皆さんありがとうございます。

答えて

1

文字列address[location]を括弧で囲んで一覧にしてから、他の部分を連結します。

address = [address[location]] + address[:location] + address[location+1:] 

例:

address = ['park', 'avenue', '1'] 
location = 2 
address = [address[location]] + address[:location] + address[location+1:] 

print(' '.join(address)) # => '1 park avenue' 
+0

さて、これは間違いなく私には意味があります。これは私の 'if'ステートメントの本体になるでしょうか?また、私はすでにやったことが意味をなさないのですか?また、どこから抜け出すのでしょうか?なぜなら、パターンの1つが見つかった場合にのみこれを実行する必要があるからです。 – Harrison

+0

はい、 'if'ステートメントの本体です。 、しかし、あなたはあなたのロジックがアップ成り立つことを確認する例をとてもたくさんに対してそれをテストする必要があります---おそらく終了します:( ')('対処[場所] isdigit?擬似コードなど)何が持っていることは私には理にかなっていますエッジケースを処理するために改良しました。 –

+0

ああ、完全には 'アドレス[位置] .isdigit()'右でなければならないのを忘れ?それを指摘してくれてありがとう! – Harrison

1

ここにあなたのコードの修正版です。シンプルなリストスライシングを使用して、アドレスリストの部分を再配置します。

ではなく、それが集合演算を使用し、一致する道路種別を検索するforループを使用。

このコードは完璧ではない:それは12aのような「数字」をキャッチしないであろう、そしてそれは「アベニュー・ロード」のような奇妙なストリート名を処理しません。

road_patterns = {'avenue', 'street', 'road', 'lane'} 

def fix_address(address): 
    address_list = address.split() 
    road = road_patterns.intersection(address_list) 
    if len(road) == 0: 
     print("Can't find a road pattern in ", address_list) 
    elif len(road) > 1: 
     print("Ambiguous road pattern in ", address_list, road) 
    else: 
     road = road.pop() 
     index = address_list.index(road) + 1 
     if index < len(address_list): 
      number = address_list[index] 
      if number.isdigit() and len(number) <= 4: 
       address_list = [number] + address_list[:index] + address_list[index + 1:] 
       address = ' '.join(address_list) 
    return address 

addresses = (
    '42 tobacco road', 
    'park avenue 1 a', 
    'penny lane 17', 
    'nonum road 12345', 
    'strange street 23 london', 
    'baker street 221b', 
    '37 gasoline alley', 
    '83 avenue road', 
) 

for address in addresses: 
    fixed = fix_address(address) 
    print('{!r} -> {!r}'.format(address, fixed)) 

出力

'42 tobacco road' -> '42 tobacco road' 
'park avenue 1 a' -> '1 park avenue a' 
'penny lane 17' -> '17 penny lane' 
'nonum road 12345' -> 'nonum road 12345' 
'strange street 23 london' -> '23 strange street london' 
'baker street 221b' -> 'baker street 221b' 
Can't find a road pattern in ['37', 'gasoline', 'alley'] 
'37 gasoline alley' -> '37 gasoline alley' 
Ambiguous road pattern in ['83', 'avenue', 'road'] {'avenue', 'road'} 
'83 avenue road' -> '83 avenue road' 
関連する問題