2015-06-30 302 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