2016-09-02 4 views
0

一部のキャンパスワイヤレスモビリティスイッチの設定を生成するスクリプトがあります。ユーザーは設定用のIPアドレスのセットを提供する必要があります。リスト内のIPが別のサブネットに属しているかどうかを確認するためのPythonic方法

これらのIPはすべて同じ/ 24サブネット(常に/ 24)になければなりません。 IPが異なるサブネット(構成を壊してしまい、すでに起こっている)にあるタイプミスを避けるために、どのIPに障害があるのか​​をユーザーに伝えたいと思います。私は次のように書いていますが、もっと良い方法があると思います。

ips = ['10.0.0.1', '10.0.0.2', '10.0.10.3', '10.0.0.4', '10.0.0.5'] 

次の仕事を取得します:

subnets = set() 
for ip in ips: 
    subnets.add('.'.join(ip.split('.')[0:3])) 
    # This would result in subnet being set(['10.0.10', '10.0.0']) 
if len(subnets) > 1: 
    seen_subnets = defaultdict(list) 

    for sn in subnets: 
     for ip in ips: 
      if sn in ip: 
       seen_subnets[sn].append(ip) 

    suspect = '' 
    for sn in seen_subnets.keys(): 
     if len(seen_subnets[sn]) == 1: 
      suspect = seen_subnets[sn][0] 
    if not suspect: 
     # Do something to tell the user one or more IP's are incorrect 
     # but I couldn't tell which ones 

注:私が持っている可能性が最小のリストがあり

リストは第三IPが間違っているところ、この、あるとし3つの項目があります。私は、おそらくほとんどすべての間違いではなく、おそらく1つのIPに過ぎないと仮定してこれをベースにしています。

もっと簡単な方法がありますか?私は解決策がいずれかの方法でsetを使用することに基づいている必要があると思うが、それは私の方法のいずれかがこれよりも役立つと思われませんでした。

+0

は、私はいくつかの行を混合しました。 – interloper

答えて

1

このような何かが働くだろう:それを固定フォーマットを固定するときあなたは正しい@Gerrat

from itertools import groupby 

ips = ['10.0.0.1', '10.0.0.2', '10.0.10.3', '10.0.0.4', '10.0.0.5'] 

def get_subnet(ip): 
    return '.'.join(ip.split('.')[:3]) 

groups = {} # group ips by subnet 
for k, g in groupby(sorted(ips), key=get_subnet): 
    groups[k] = list(g) 

# Sort the groups by most common first 
for row, (subnet, ips) in enumerate(
    sorted(groups.iteritems(), key=lambda (k, v): len(v), reverse=True) 
): 
    if row > 0: # not the most common subnet 
     print('You probably entered these incorrectly: {}'.format(ips)) 
+0

面白い! 'for'ループについては疑問があります。あなたが 'v'だけを使うつもりなら、ラムダで' k'を渡す必要はありますか?私はそれが位置的な要求だと思うので、ソートはキーではなく 'groups' dictの値の長さで行われますが、それは私の推測です。 – interloper

+1

@interloper:正解 - 位置的な必要条件です。この場合、キー関数はタプルに渡されます。あなたはそれを一つの変数(例えば、 't'ですが、' t [1] 'でソートする必要があります)で名前を付けることができます。このように私には直感的に思えました。 – Gerrat

+0

ありがとうございます。私は、この回答によって、複数の「間違った」サブネットについて報告することができますが、そうは思われません。 – interloper

関連する問題