按第一列

时间:2015-06-30 22:42:23

标签: python sorting grouping

我尝试根据第一列的值对来自2列对象的数据进行分组。我需要列表中的这些数据,以便我可以在之后对它们进行排序。我在大量机器上使用snmp获取接口数据。在示例中,我有2个接口。我需要按接口分组的数据,最好是在列表中。

我得到的数据是在对象项目中:

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

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

我想将这些数据按照第一列中的值按列表排序,如下所示:

我想将这些数据放在一个列表中,所以它看起来像这样:

list = [[lo,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,short和更快的方法吗?限制因素是我使用key = data值获取2列对象中的数据。

2 个答案:

答案 0 :(得分:2)

我不确定是否按照您的排序方式进行排序,因为我没有看到任何订单,但是您可以使用oid 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) 分组进行分组:

func openEachFile(inDirectory path: String) {
    let subs = try! FileManager.default.subpathsOfDirectory(atPath: path)
    let totalFiles = subs.count
    print(totalFiles)
    for sub in subs {
        if sub.hasPrefix(".DS_Store") {
            //a DS_Store file
        }
        else if sub.hasSuffix(".xcassets") {
            //a xcassets file
        }
        else if (sub as NSString).substring(to: 4) == ".git" {
            //a git file
        }
        else if sub.hasSuffix(".swift") {
            //a swift file
        }
        else if sub.hasSuffix(".m") {
            //a objc file
        }
        else if sub.hasSuffix(".h") {
            //a header file
        }
        else {
            // some other file
        }
        let fullPath = (path as NSString).appendingPathComponent(sub)
    }
}

使用您的代码只需使用以下属性:

typedef NS_ENUM(NSInteger, TabataStates) {
   TabataStatesIDLE
   TabataStatesSTARTING,
   TabataStatesEXERCISe,
   TabataStatesRELAXATION
};

答案 1 :(得分:1)

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

# 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)

如果您安装了大熊猫,这应该会运行。如果您对安装pandas没有任何线索,请获取“anaconda python发行版”。