在dict中设置列表的默认值



我有一个程序,该程序当前使用 defaultdict(list)创建一个词典,其中一个值列表每个键。

我正在从思科无线LAN控制器中提取处理数据。

我目前会获得看起来像这样的输出:

AP-1    3    5    4    6
AP-2    1    1 
AP-3    9    7    8    9

数字的每一列表示连接到AP的客户端数当我运行show client summary命令时。


一切都有效,但是有一个问题。

我目前将项目添加到列表中,如下所示:

for k, v in d.items():
    e[k].append(v)

问题是添加了所有条目,从索引0开始。

查看上面的AP-2。假设我第一次运行命令时有零连接的客户

我生成的输出确实应该像这样:

AP-1    3    5    4    6
AP-2         1         1 
AP-3    9    7    8    9

这表明AP-2在第二和第四次通过期间有一个连接的客户端,但是在第一和第三次通过期间没有客户。

我正在尝试尝试将其添加到这样的列表中:

d['key1'].insert(index, value)

index是我在循环多个迭代时保持的计数器show client summary命令的行为,但其行为类似于list.append()

即使d['key1'].insert(1, 'a')也与d['key1'].append('a')也没有什么不同。

关于我如何根据位置(索引(将值插入列表中的任何建议,因为在任何时间点都不能保证访问点已连接的客户端?

注意。在第一张通过时,AP-2甚至在字典中都不存在,因为它没有客户端,也没有出现在show client summary的输出中命令。AP-2的首次出现在第二次。

这是对发布工作代码的请求的回应:

````

def ap_data(ssh_channel):
    ssh_channel.send("config paging disable" + "n")
    time.sleep(0.9)
    outp = ssh_channel.recv(35000)
    shclisumstring = outp.decode("utf-8")
    shclisumstring = ''
    d = defaultdict(int)
    e = defaultdict(list)
    x = 0
    starttime = time.time()
    while x < 3:
        ssh_channel.send("show client summary" + "n")
        time.sleep(0.9)
        outp = ssh_channel.recv(100000)
        shclisumstring = outp.decode("utf-8")
        shclisumlist = shclisumstring.splitlines()
        # print("shclisumlist.splitlines(): {}".format(shclisumlist))
        del shclisumlist[:12]
        del shclisumlist[-3:]
        for line in shclisumlist:
            regex = re.compile(r'([0-9a-f]{2}[:-]){5}([0-9a-f]{2})(s)(.+?)(s)')
            mo = regex.search(line)
            ap_name = mo.group(4)
            d[ap_name] += 1
        for k, v in d.items():
            e[k].append(v)
        d.clear()
        time.sleep(15.0 - ((time.time() - starttime) % 15.0))
        x += 1
    print('{:25}{:6}{:6}{:6}'.format('       AP', '  7:00', '  7:15', '  7:30'))
    print('-' * 43)
    for k, v in e.items():
        print('{:25}'.format(k), end='')
        for i in v:
            print('{:6}'.format(i), end='')
        print()

````

进一步澄清:

"显示客户端摘要"生成了连接到控制器中存在的访问点的客户端列表。我正在做的是简单地添加客户端并制作一个报告,该报告显示运行命令时将" X"端数连接到每个访问点(AP(。我的目标是能够在一段时间内显示每个AP的客户负载。我可能每15分钟运行一次命令两个小时,这将在每次运行时都会连接客户端连接端,这将产生八个值。

我的问题是,我不仅要展示多少客户,而且要展示何时。当我运行命令时,"当"是"什么时候"。

这有帮助还是您需要更多?

并不完全清楚您需要什么,但是以下可能会有所帮助。原则上,可以将类似的逻辑应用于字典的迭代器。如果字典为空,我们使用list.append(None)

from collections import defaultdict
result = {}
result['AP-1'] = [{'AP-1': 3}, {'AP-1': 5}, {'AP-1': 4}, {'AP-1': 6}]
result['AP-2'] = [{},          {'AP-2': 1}, {},          {'AP-2': 1}]
result['AP-3'] = [{'AP-3': 9}, {'AP-3': 7}, {'AP-3': 8}, {'AP-3': 9}]
d_out = defaultdict(list)
for ap in result:
    for d in result[ap]:
        if not d:
            d_out[ap].append(None)
        for k, v in d.items():
            d_out[ap].append(v)
# defaultdict(list,
#             {'AP-1': [3, 5, 4, 6],
#              'AP-2': [None, 1, None, 1],
#              'AP-3': [9, 7, 8, 9]})

最新更新