我有一个程序,目前使用defaultdict(list)
创建一个字典,其中包含每个键的值列表。
我正从思科无线局域网控制器中提取\处理数据。
我目前得到的输出如下:
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()
```
进一步澄清:
'show client summary'生成连接到控制器中存在的接入点的客户端列表。我正在做的只是添加客户端并生成一个报告,显示运行命令时“x”个客户端连接到每个接入点(AP)。我的目标是能够在一段时间内显示每个AP的客户端负载。我可以每15分钟运行一次命令两小时,这将为每个AP生成8个值,假设每次运行时AP都连接了客户端。
我的问题是,我不仅要展示有多少客户,还要展示何时。 '什么时候'就是我运行命令的时候。
这有帮助还是需要更多?
答案 0 :(得分:1)
您并不十分清楚自己需要什么,但以下内容可能有所帮助。原则上,类似的逻辑可以应用于字典的迭代器。如果字典为空,我们使用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]})