我创建了这个类:
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中
答案 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作为自然查找键。