2015-06-30 304 views
1

我想基于第一列的值从2列对象中分组数据。我需要列表中的这些数据,以便我可以在之后进行分类。我正在大量机器上用snmp获取接口数据。在这个例子中,我有2个接口。我需要按照接口分组的数据,最好在列表中。按值分组数据按第一列

数据我得到的是在目标项目:

for i in item: 
    print i.oid, i.val 

ifDescr lo 
ifDescr eth0 
ifAdminStatus 1 
ifAdminStatus 1 
ifOperStatus 1 
ifOperStatus 0 

我想获得这个数据在第一列的值列表中的排序,是这样的:

我想获取列表中这个数据,所以它看起来是这样的:

名单= [[10,1,1],[eth0,1,0]

解决方案我公顷我很肮脏,很长,我很尴尬地发布在这里,所以任何帮助表示赞赏。

这是我的解决方案,让您更好地了解我在说什么。我所做的是将每个接口数据放在基于item.oid的单独列表中,然后通过cpu列表迭代,并将其与基于item.iid的内存和名称进行比较。最后,我有所有的数据在cpu列表中,其中每个接口是列表的一个元素。这个解决方案有效,但对我的需求来说太慢了。

cpu=[] 
memory=[] 
name=[] 

for item in process: 
    if item.oid=='ifDescr': 
     cpu.append([item.iid, int(item.val)]) 
    if item.oid=='ifAdminStatus': 
     memory.append([item.iid, int(item.val)]) 
    if item.oid=='ifOperStatus': 
     name.append([item.iid, item.val]) 


for c in cpu: 
    for m in memory: 
     if m[0]==c[0]: 
      c.append(m[1]) 
    for n in name: 
     if n[0]==c[0]: 
      c.append(n[1]) 
cpu=sorted(cpu,key=itemgetter(1),reverse=True) #sorting is easy 

是否有pythonic,短而快的方式做到这一点?限制因素是我用key = data值获取2列对象中的数据。

+0

感谢您的帮助,但我更新了问题,以便更清楚地了解我想要的内容。 – Notoc

回答

2

不知道我按照你的排序,因为我没有看到任何订单,但到组,你可以通过使用oid的重复键一个defaultdict使用的字典分组:

data = """ifDescr lo 
ifDescr eth0 
ifAdminStatus 1 
ifAdminStatus 1 
ifOperStatus 1 
ifOperStatus 0""" 

from collections import defaultdict 

d = defaultdict(list) 
for line in data.splitlines(): 
    a, b = line.split() 
    d[a].append(b) 
print((d.items())) 
[('ifOperStatus', ['1', '0']), ('ifAdminStatus', ['1', '1']), ('ifDescr', ['lo', 'eth0'])] 

使用你的代码只使用属性:

for i in item: 
    d[i.oid].append(i.val) 
+0

我更新了我的问题,以便更清楚。事情是,我的数据来自snmpwalk中的一个对象,我需要将它构造成一个2D列表,其中每个列表元素都是一个界面的数据。 – Notoc

+0

我仍然很确定我的代码完全是这样做的,但无论如何[eth0,1,0]是如何产生的? –

+0

从这里:[(0,1),(0,2),(1.1),(1,2)] 我需要这个: [0(1,2),1 [1,2]] – Notoc

1

熊猫是处理数据的好方法。这是一个简单的示例代码。查看官方网站了解更多信息。

# Python script using Pandas and Numpy 
from pandas import DataFrame 
from numpy import random 

# Data with the dictionary keys defining the columns 
data_dictionary = {'a': random.random(5), 
        'b': random.random(5)} 
# Make a data frame 
data_frame = DataFrame(data_dictionary) 
print(data_frame) 

# Return an new data frame with a sorted first column 
data_frame_sorted = data_frame.sort_index(by='a') 
print(data_frame_sorted) 

这应该运行,如果你有numpy熊猫安装。如果你对安装熊猫没有任何线索,可以去“anaconda python发行版”。

+0

我更新了我的问题,以便更清楚。事情是,我的数据来自snmpwalk中的一个对象,我需要将它构造成一个2D列表,其中每个列表元素都是一个界面的数据。 – Notoc