Python:更新集合中的对象

时间:2017-01-19 11:17:59

标签: python

我创建了这个类:

class Device(object):
    """Holds searched SSID, searched BSSID and 
       own MAC-Addr information about a device"""

    def __init__(self, mac):
        self.mac = mac
        self.bssid_set = set()
        self.ssid_set = set()

    def add_bssid(self, bssid):
        self.bssid_set.add(bssid)

    def add_ssid(self, ssid):
        self.ssid_set.add(ssid)

    def __str__(self):
        ssid_str = ', '.join(self.ssid_set)
        bssid_str = ', '.join(self.bssid_set)
        return "{mac} has searched for {ssid_str} and {bssid_str}".format(
                mac = self.mac,
                ssid_str = ssid_str,
                bssid_str = bssid_str)

我想创建这个类的多个对象,把它们放在一个集合中(没有重复)并在我找到一个有另一个ssid或bssid的新探测请求时更新对象,所以set的标识符应该是mac

要么我太盲目无法看到如何正确使用集合,要么我在这里尝试错误的东西,因为更新集合只是添加了一个新对象,但我不需要这个。

只使用这样的字典会更明智吗?

mac = 'abcd'
ssid = set(['ssid1', 'ssid2'])
bssid = set(['bssid1', 'bssid2'])
dict[mac] = [ssid.update('newssid'), bssid.update('newbssid')]

或者什么是pythonic方式去这里?

编辑:意外地将''围绕mac放在dict中

2 个答案:

答案 0 :(得分:1)

Defaultdict可以做你班级正在做的事情

from collections import defaultdict

d = defaultdict(dict)
d['mac1']['bssid']=set()
d['mac1']['ssid']=set()
d

输出:

defaultdict(dict, {'mac1': {'bssid': set(), 'ssid': set()}})

答案 1 :(得分:0)

我会选择"你在这里尝试了错误的东西"。

集合中的对象不应该改变。如果你做了意外改变对象哈希(或比较结果)的事情,那么就会发生不好的事情,你可能会得到重复或丢失的对象。集合也不允许您通过索引检索事物,因此如果您需要修改任何内容,您应该查看整个集合并创建一个具有所需修改的新集合。 (是的,您可以通过散列和比较忽略内部集合的方式实现它,但是......为什么?)

如果您只在标准词典中保留mac -> Device映射,那可能会更容易,因为您始终将mac作为自然查找键。