免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 13265 | 回复: 7
打印 上一主题 下一主题

python嵌套字典的输出问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-06-01 00:01 |只看该作者 |倒序浏览
本帖最后由 kkpphy 于 2014-06-01 00:04 编辑

本人初学python,本着通过实践来学习的目的.想写一个linux系统监控的脚本.
实现了一个很基本很基本的功能.但是觉得做法太过傻缺.
特此开帖,想各位大大求解.

代码如下:

  1. #这里是我定义的一个数据存储的结构
  2. #大概结构是这样的:{IP:{时间:{CPU:CPU,MEM:MEM}}}
  3. res_all = {'192.168.100.164': {'2014-05-31 18:33:03': {'mem': {'Total': '2022', 'free': '1902'}, 'load': '0.00', 'cpu': '99.12%'}}}

  4. def print_tree(tree):
  5.     #print tree
  6.     count = 0
  7.     for k, v in tree.items():
  8.         print k
  9.         if type(v) == dict:
  10.             count = 2
  11.             for i,j in v.items():
  12.                 print ' '*count+i
  13.                 if type(j) == dict:
  14.                     for x,y in j.items():
  15.                         if type(y) == dict:
  16.                             print '  '*count+x
  17.                             for a in y.keys():
  18.                                 count = 4
  19.                                 print '  '*count+a,y[a]
  20.                                 count = 2
  21.                         else:
  22.                             print '  '*count+x,y
  23.                 else:
  24.                     print '  '*count+j
  25.         else:
  26.             print v
  27.         

  28. print_tree(res_all)
复制代码
目前勉强能够打印一个树形的结构.但是读取字典的方式太过傻缺.还请指教.
  1. 192.168.100.164
  2.   2014-05-31 18:33:03
  3.     mem
  4.         Total 2022
  5.         free 1902
  6.     load 0.00
  7.     cpu 99.12%
复制代码

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
2 [报告]
发表于 2014-06-01 10:18 |只看该作者
这是自己把自己搞复杂了。。。
关键是初始的数据结构,dict很高级但不是万能的,运帷数据第一维度自然是时间,其它需要聚合的项可以用list,比如:
  1. res_all = [
  2.   [time,ip,[mem_rss, mem_vsize, ...], [cpu_usr, cpu_sys, ...]],
  3. ...,
  4. ]
复制代码
顺序遍历:
  1. for time, ip, mem, cpu in res_all:
  2.     pass
复制代码
原则就是尽量简化存储数据结构,后面的处理才会简单直观。

论坛徽章:
0
3 [报告]
发表于 2014-06-01 10:49 |只看该作者
本帖最后由 y2k_connect 于 2014-06-01 20:28 编辑
  1. res_all = {
  2.     'set_ip': set(['192.168.100.164', '192.168.1.2', ...]),
  3.     '192.168.100.164': {
  4.             'set_time': set(['2014-05-31 18:33:03', '2014-05-31 18:34:03'. ...]),
  5.             '2014-05-31 18:33:03': {
  6.                     'arr_order': ['mem', 'load', 'cpu'],
  7.                     'mem': {
  8.                             'arr_order': ['Totle', 'free'],
  9.                             'Total': '2022',
  10.                             'free': '1802',
  11.                             }
  12.                     'load': '0.00',
  13.                     'cpu': '99.12%',
  14.                     },
  15.             '2014-05-31 18:34:03': {...},
  16.             ...
  17.             },
  18.     '192.168.1.2': {...},
  19.     ...
  20.     }
复制代码

论坛徽章:
0
4 [报告]
发表于 2014-06-01 13:36 |只看该作者
本帖最后由 kkpphy 于 2014-06-01 13:38 编辑

回复 2# timespace

谢谢timespace:
    我也有考虑过用list来构造数据结构.但是想想.觉得还是dict直观.
    然后使用ip做第一维度,是考虑到,以设备为唯一标识,我dict[ip]就可以看到一台设备的所有时刻的资源信息.

    我昨晚的问题其实是想问怎么迭代方式的去读取字典里面的数据,后来看别人例子的时候,才知道定义函数可以自己嵌套自己.现在基本已经解决了.
  1. def print_tree(tree):
  2.       for k, v in tree.items():
  3.            if isinstance(v, dict):
  4.                 print_tree(v)
  5.            else:
  6.                 print k
复制代码
不过还是存在你说的问题,数据结构的设计问题.需要考虑怎么才能让数据处理更便捷.直观.

论坛徽章:
12
射手座
日期:2014-10-02 11:31:29程序设计版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-27 06:20:00程序设计版块每日发帖之星
日期:2016-05-27 06:20:00程序设计版块每日发帖之星
日期:2016-05-25 06:20:00每日论坛发贴之星
日期:2016-05-24 06:20:00程序设计版块每日发帖之星
日期:2016-05-24 06:20:0015-16赛季CBA联赛之深圳
日期:2016-05-23 15:33:59程序设计版块每日发帖之星
日期:2016-05-20 06:20:00程序设计版块每日发帖之星
日期:2016-04-26 06:20:00神斗士
日期:2015-12-03 09:27:3215-16赛季CBA联赛之八一
日期:2016-12-29 09:56:05
5 [报告]
发表于 2014-06-01 13:44 |只看该作者
这思路不错啊。
呵呵,谢谢timespace:

论坛徽章:
0
6 [报告]
发表于 2014-06-01 14:06 |只看该作者
本帖最后由 kkpphy 于 2014-06-01 14:07 编辑

回复 3# y2k_connect


    我是蛮喜欢你的这个数据结构.比我的更清晰.规范
    就是总觉得我们这样的结构处理起来不是很方便.

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
7 [报告]
发表于 2014-06-01 14:21 |只看该作者
回复 4# kkpphy
我的只是一般思路,具体取舍还是看你对需求的把握。忘记提到一点,数据源是什么,因为通常来说这种过滤数据库就搞定了,是直接数据库提取吗?


   

论坛徽章:
0
8 [报告]
发表于 2014-06-02 11:16 |只看该作者
本帖最后由 y2k_connect 于 2014-06-02 11:17 编辑

因为python对递归次数有限制(debian环境,最大998次),所以最好是不用递归。
参见:
python递归限制
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP