-1

次のようなリストのリストがあります。

aList= [['192.168.1.3', '0080.4522.ad08', '2013/05/02 19:10:10', 'automatic'],
['192.168.1.2', '0080.4522.ad08', '2013/05/02 19:05:00', 'automatic']]

別のリストを追加するとき、それらを追加する前に、IP または MAC アドレスが別のリストにあるかどうかを確認したいのですが、それらが既にリストのリストにある場合は、追加したくありません。たとえば、192.168.1.3 をテストしていた場合、その要素は既にどこかに存在するため、リストに追加されません。だから私はこのリストをもう一度追加しようとしているかもしれませんが、失敗したいです:

['192.168.1.3', '0080.4522.ad08', '2013/05/02 19:10:10', 'automatic']

私が行ってきた方法は、要素が見つかったらリストをループしてブール値を設定することですが、この方法は素晴らしいとは思いません。どのようにしますか?IP は常に各リストの要素 1 になることはわかっていますが、インデックスに依存することも悪い方法のようです。

4

4 に答える 4

3

使用できますany

>>> lis = ['192.168.1.3', '0080.4522.ad08', '2013/05/02 19:10:10', 'automatic']
if any(item[0] == lis[0] or item[1] == lis[1]  for item in aList)
    #then don't add
else:
    #add
于 2013-06-20T10:53:32.213 に答える
2

これを解決する良い方法は、オブジェクトを使用し、リストをリスト/タプルのリストではなくオブジェクトのリストにすることです。次に、オブジェクトの比較関数をオーバーライドして、通常の「in」ステートメントを使用できます。

class Client:
    def __init__(self,  ip, mac, timedate, mode):
        self.ip = ip
        self.mac = mac
        self.timedate = timedate
        self.mode = mode

    def __eq__(self, object):
        if type(object) != type(self):
            return False

        if object.ip == self.ip or object.mac == self.mac
            return True
        return False

その後、次のようなことができます

client = Client("127.0.0.1", "abwdds", date, mode)
if client not in list:
    doSomething()
    list.append(client)
于 2013-06-20T11:01:27.280 に答える
1

IP アドレスがデータのキー列である場合は、IP アドレスを他の列のタプル (またはリスト) にマッピングするディクショナリを使用する必要があります。

于 2013-06-20T10:56:15.670 に答える
1

辞書を使用して接続を保持します。

cons = [{'IP':'192.168.1.3', 'MAC':'0080.4522.ad08', 'timestamp':'2013/05/02 19:10:10', 'type':'automatic'},
        {'IP':'192.168.1.2', 'MAC':'0080.4522.ad08', 'timestamp':'2013/05/02 19:05:00', 'type':'automatic'}]

def add_con(con):
    if any((con['IP'] == c['IP'] or con['MAC'] == c['MAC']) for c in con):
        # duplicate
    else:
        # new

この機能をクラスに簡単にラップできます。


class ConnectionManager():

    def __init__(self):
        self.connections = []

    def add_con(ip, mac, timestamp, mode):
        if any((ip == c['IP'] or mac == c['MAC']) for c in self.connections):
            # duplicate
            return False # possible option?
        else:
            self.connections.append({'IP':ip, 'MAC':mac, 'timestamp':timestamp, 'mode':mode})
            return True # possible option?
于 2013-06-20T10:59:31.500 に答える