2012-04-15 1 views
3

は、私は例えば、電話番号の範囲を、持っているプレフィクスリストに電話番号の範囲リストの変換

3331234 
... 
3331239 
333124 
... 
333129 
33313 
... 
33319 
33320 
... 
33322 
333231 
333232 
333233 
3332341 
... 
3332345 

質問は簡単ではありません。私は、範囲の開始と終了の間に数字のリストを取得する必要はありません。 「 - 」あなたはで区切られた値の共通のプレフィックスを取得する必要があります

+3

自分_anything_しようとしたことがありますか?私たちはあなたのために完全な解決策を書くのではありません。他のニュースでは、プレフィックスはどういうものですか?私は '333'と仮定していますが、あなたの質問は指定していません。 – Bojangles

+0

私はコードを探していません。私は射撃を探しています。プレフィックスは、10文字、100文字、1000文字などの文字列を含む最長の「文字列」です。 – vpol

答えて

0

私の作業コードです。あまり速くはないが、働いている。最適化を歓迎します。

def fill(root, prefix, value, parent, pkey): 
    if len(prefix) > 1: 
     if prefix[0] in root: 
      fill(root[prefix[0]], prefix[1:], value, root, prefix[0]) 
      if pkey: 
       if len(parent[pkey]) == 10: 
        parent[pkey] = value 
     elif type(root) == type({}): 
      root[prefix[0]] = {} 
      fill(root[prefix[0]], prefix[1:], value, root, prefix[0]) 
      if pkey: 
       if len(parent[pkey]) == 10: 
        parent[pkey] = value 
    elif type(root) == type({}): 
     root[prefix[0]] = value 
     if pkey: 
      if len(parent[pkey]) == 10: 
       parent[pkey] = value 
    return root 

def compact(prefixes, current): 
    if not type(prefixes) == type({}): 
     return [current] 
    else: 
     rlist = [] 
     for k, v in prefixes.iteritems(): 
      rlist.extend(compact(v, current + k)) 
      continue 
     return rlist 

if __name__ == '__main__': 
    plist = {} 
    for x in range(4440000, 4490000): 
     fill(plist, str(x), 'value', plist, None) 
    #print plist 
    print compact(plist, '') 
0

ので、:あなたは違い

  • を見つけるまで、これらを取得し、それらを反復処理する

    • 使用.splitはとの最初の値を記入しますゼロ(最小数を取得するために)あなたがphone_len数字を取得し、(ナインとの)最大のために同じことを行うまで
    • その後、あなたはそれらを介して数字
    • 反復の簡単な範囲を持っていると
    • を文字列にそれらを変換します

    ここにある:

    phone_len = 7 
    R = "33312345-3332345".split("-") 
    
    prefix = "" 
    for i in range(len(R[0])): 
        if R[0][i] == R[1][i]: 
         prefix += R[0][i] 
        else: 
         break 
    
    m = int(R[0]+"0"*(phone_len-len(R[0]))) 
    M = int(R[1]+"9"*(phone_len-len(R[0]))) 
    
    phones = [str(n) for n in range(m, M+1)] 
    
  • +0

    私のプレフィックスリストを確認してください。場合によっては5桁しかない場合があります。たとえば、プレフィックス33313〜33319は3331300〜3331999の範囲です。 – vpol

    +0

    @vpol大変申し訳ありませんが、あなたの質問は不明です...もう少し明確にすることはできますか? – jadkik94

    +0

    iveさんが質問を編集しました。今大丈夫? – vpol

    0

    ここでは、この問題に対処するための一つの方法のスケッチです。私はコメントに説明されている詳細を記入する必要がある箇所に楕円を使用しました。私は 'maxpower'の初期値を導出するための関数を書いていますが、それ以外はすべてインラインで書けるように単純です。

    firstnumber = 3331234 
    lastnumber = 3332345 
    
    current = firstnumber 
    
    while current <= lastnumber: 
    
        # Find the largest power of 10 that exactly divides 'current'. 
        # Call this value 'maxpower'. 'maxpower' is a candidate for the 
        # size of the block of numbers that will be represented by the 
        # next output value. 
    
        maxpower = ...  # 1, 10, 100, 1000, 10000, and so on 
    
        # If a block of size 'maxpower' would take us past the 
        # 'lastnumber', we can't use that block size. We must try a 
        # smaller block. Divide 'maxpower' by 10 until the block size 
        # becomes acceptable. 
    
        while (current + maxpower) > ... : 
         maxpower /= 10 
    
        # Now 'maxpower' is the largest acceptable size for the next 
        # block, so the desired prefix is 'current' divided by 'maxpower'. 
        # Emit that value, then add 'maxpower' to 'current' to get the new 
        # 'current' value for the next iteration. 
    
        print ... 
        current += maxpower 
    
    1

    私の作業コードです。あまりにも速くはありません。最適化を歓迎します。

    def diap_to_prefix(a, b): 
        lst = ['%0*d'%(max(len(str(a)), len(str(b))), x) for x in range(int(a), int(b)+1)] 
        new_lst = [] 
    
        while len(lst) != len(new_lst): 
         lst = new_lst or lst 
         new_lst = [] 
    
         c = lst[0] 
         tmp_lst = [c] 
    
         for i in lst[1:]: 
          if c[:-1] == i[:-1]: 
           c = i 
           tmp_lst.append(c) 
          else: 
           if len(tmp_lst) == 10: 
            new_lst.append(c[:-1]) 
           else: 
            new_lst.extend(tmp_lst) 
    
           c = i 
           tmp_lst = [c] 
    
         if len(tmp_lst) == 10: 
          new_lst.append(c[:-1]) 
         else: 
          new_lst.extend(tmp_lst) 
    
        return lst 
    
    1

    私の新しい、より最適解(py3.4)

    def diap_to_prefix(a, b): 
        def inner(aa, bb, p): 
         if p == 1: 
          if a <= aa <= b: 
           yield aa 
          return 
    
         for d in range(aa, bb + 1, p): 
          if a <= d and d + p - 1 <= b: 
           yield d // p 
          elif not (bb < a or aa > b): 
           for i in range(10): 
            yield from inner(d + i * p // 10, d + (i + 1) * p // 10 - 1, p // 10) 
    
        a, b = int(a), int(b) 
        p = 10**(max(len(str(x)) for x in (a, b)) - 1) 
        yield from inner(a // p * p, b // p * p + p - 1, p)