【问题标题】:Set a default value for a list in a dict为字典中的列表设置默认值
【发布时间】:2018-04-02 00:19:15
【问题描述】:

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

我正在从 Cisco 无线 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 分钟运行一次命令,持续两个小时,这将生成每个 AP 的八个值,假设 AP 每次运行时都连接了客户端。

我的问题是,我不仅要显示有多少客户,还要显示何时。 “何时”只是我运行命令的时间。

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

【问题讨论】:

  • 你能展示生成你的输出的代码吗?
  • 你知道先验的AP列表吗?

标签: python python-3.x list dictionary python-3.6


【解决方案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]})

【讨论】:

  • 我的嵌入式列表严格包含运行“显示客户端摘要”命令时的客户端计数。我提供了上面的代码。
  • @MarkS,抱歉我不懂这些术语:“嵌入式列表”/“客户端计数”/“显示客户端摘要命令”.. 也许是我有点慢。但是,更重要的是,您能否说出您的问题以便更广泛的受众能够理解?
猜你喜欢
  • 1970-01-01
  • 2016-07-19
  • 1970-01-01
  • 1970-01-01
  • 2018-12-06
  • 2016-12-28
  • 2019-08-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多