将观察结果表示为字典并基于一个键和值集进行过滤

时间:2013-06-02 03:58:29

标签: python dictionary filter

我有一个数据集(在一个文件中),由多个具有各种属性(列)的观察(行)组成。例如:

AttrA   AttrB   AttrC
 1       12      'a'
 2       43      'd'
 3       23      'f'
 4       25      'z' 

我将此数据集放入python词典中,以便:

data = {'AttrA':[1,2,3,4],'AttrB':[12,43,23,25],'AttrC':['a','d','f','z']}

我希望能够根据其中一个键的标准过滤观察结果。举些例子。过滤AttrA的观察值> = 3,这样:

 AttrA   AttrB   AttrC
 3       23      'f'
 4       25      'z' 

reducedData = {'AttrA':[3,4],'AttrB':[23,25],'AttrC':['f','z']}

看起来你可以做类似的事情:reduceddata = {(k,v) for k,v in data if (??)},但我不确定if语句之后会发生什么。此外,字典是此示例中使用的最佳数据类型吗?如果数据在嵌套列表中,似乎更容易过滤。

提前谢谢!!

3 个答案:

答案 0 :(得分:2)

我会先改变结构:

table = [dict(zip(data.keys(), row)) for row in zip(*data.values())]

它看起来像这样:

[{'AttrA': 1, 'AttrB': 12, 'AttrC': 'a'},
 {'AttrA': 2, 'AttrB': 43, 'AttrC': 'd'},
 {'AttrA': 3, 'AttrB': 23, 'AttrC': 'f'},
 {'AttrA': 4, 'AttrB': 25, 'AttrC': 'z'}]

现在,您可以像您描述的那样过滤它:

[row for row in table if row['AttrA'] >= 3]

答案 1 :(得分:1)

def my_filter(data,attr,val):
    ind = [i for i,x in enumerate(data[attr]) if x >= val]
    reducedData  = {k: [v[i] for i in ind] for k,v in data.items()}
    return reducedData 

data = {'AttrA':[1,2,3,4],'AttrB':[12,43,23,25],'AttrC':['a','d','f','z']}

print my_filter(data, 'AttrA',3)

<强>输出:

{'AttrB': [23, 25], 'AttrC': ['f', 'z'], 'AttrA': [3, 4]}

答案 2 :(得分:0)

我想我会选择:

data = [(12, 'a'), (43, 'd'), (23, 'f'), (25, 'z')]
data_dic = dict(enumerate(data, 1))
reducedData = {k:v for k, v in data_dic if k >= 3}