2017-01-05 7 views
1

私はリンクのためにGoogleにスキャンするプログラムを持って、それはあなたが見つけたどのように多くのリンクを確認した後、右の検索に成功を見つけようとします:dictキーの範囲の使い方は?

def check_urls_for_queries(self): 
    """ The returned URLS will be run through a query regex to see if 
     they have a query parameter. 
      http://google.com <- False 
      http://example.com/php?id=2 <- True 
    """ 
    filename = settings.create_random_filename() 
    print("File being saved to: {}".format(filename)) 
    with open("{}\\{}.txt".format(settings.DORK_SCAN_RESULTS_PATH, filename), 
       "a+") as results: 
     for url in self.connect_to_search_engine(): 
      match = settings.QUERY_REGEX.match(url) # Match by regex for anything 
                # that has a ?=<PARAM> in it 
      if match: 
       results.write(url + "\n") 
    amount_of_urls = len(open(settings.DORK_SCAN_RESULTS_PATH + "\\" + filename 
           + ".txt", 'r').readlines()) 
    return("\nFound a total of {} usable links with query (GET) parameters, urls" 
      " have been saved to {}\\{}.txt. This Dork has a success rate of {}%". 
      format(amount_of_urls, settings.DORK_SCAN_RESULTS_PATH, filename, 
        self.success_rate[amount_of_urls] 
        if amount_of_urls in self.success_rate.keys() else 
        'Unknown success rate')) 

私がやりたい、何が成功を作成することです辞書のキーあたりの範囲使用率:

success_rate = { 
    range(1, 10): 10, range(11, 20): 20, range(21, 30): 30, 
    range(31, 40): 40, range(41, 50): 50, range(51, 60): 60, 
    range(61, 70): 70, range(71, 80): 80, range(81, 90): 90, 
    range(91, 100): 100 
} 

をしかし、明らかにリストがハッシュ可能オブジェクトではありませんので、これは動作しません:

Traceback (most recent call last): 
    File "tool.py", line 2, in <module> 
    from lib.core import BANNER 
    File "C:\Users\Documents\bin\python\pybelt\lib\core\__init__.py", line 1, in <module> 
    from dork_check import DorkScanner 
    File "C:\Users\Documents\bin\python\pybelt\lib\core\dork_check\__init__.py", line 1, in <module> 
    from dorks import DorkScanner 
    File "C:\Users\\Documents\bin\python\pybelt\lib\core\dork_check\dorks.py", line 6, in <module> 
    class DorkScanner(object): 
    File "C:\Users\Documents\bin\python\pybelt\lib\core\dork_check\dorks.py", line 11, in DorkScanner 
    range(1, 10): 10, range(11, 20): 20, range(21, 30): 30, 
TypeError: unhashable type: 'list' 

ですそこに私は1つのキーを作ることから自分を保存するためにdictキーの範囲を使用することができる方法  -   100?

+0

タプルを作成します。タプルはハッシュ可能です。 'tuple(range(1、10))' –

+1

ここにリストを使用したくない場合は、範囲*のすべての整数が含まれています。代わりに 'xrange()'オブジェクトを使用してください。これはハッシュ可能で、開始値と終了値のみを格納します。 –

+1

それはあなたが最も近い "10位"に丸めているように見えるのではなく、単にルックアップするのではなく – MooingRawr

答えて

2

range()はPython 2で単なる整数のリストを返す関数であり、それ自体はオブジェクトの型ではありません。ここにはのすべての整数がの範囲に含まれているので、ここではリストを使用したくないです。

代わりにxrange() objectsを使用できます。これらはハッシュ可能で、開始値と終了値のみを格納します。ただし、の他のをご使用になる場合は、これらのキーを使用する辞書はあまり役に立ちませんので、辞書をループして各xrangeのオブジェクトを手動でテストする必要があります。

あなたの成功率辞書は、より簡単に数学に置き換えることができます。ちょうど(単に床部門を使用して)10の倍数までご数字ラウンド:その結果の値が10と100の間であれば

success_rate = ((amount_of_urls // 10) + 1) * 10 

テストを実行します。

10 <= success_rate <= 100 
1

をRangeKeyDictクラスのことができるように可能性より一般的で使いやすいこのようなケースを処理します。

pip install range-key-dict 

使用法:

from range_key_dict import RangeKeyDict 

if __name__ == '__main__': 
    range_key_dict = RangeKeyDict({ 
     (0, 100): 'A', 
     (100, 200): 'B', 
     (200, 300): 'C', 
    }) 

    # test normal case 
    assert range_key_dict[70] == 'A' 
    assert range_key_dict[170] == 'B' 
    assert range_key_dict[270] == 'C' 

    # test case when the number is float 
    assert range_key_dict[70.5] == 'A' 

    # test case not in the range, with default value 
    assert range_key_dict.get(1000, 'D') == 'D' 

https://github.com/albertmenglongli/range-key-dict

参考:この記事で答えを確認してください:Range as dictionary key in Python

使用方法については、使用してそれをインストールする__main__

にコードをチェック

関連する問題