2014-11-21 98 views
1

您好我是一个phyton newbee在一个麻烦的地方我正在从互联网上读取一个文件并通过分割新行然后在逗号上进行清理和输出数千行看起来是这样的:如何统计列表中的元素,并将它们放在字典中

[59, 'Self-emp-inc', 'none', 'none', 10, 'Married-civ-spouse', 
'Craft-repair', 'Husband', 'White', 'Male', 0, 0, 50, 'none', '>50K'] 

什么,我试图做的就是循环遍历行计数的每个属性,并根据最后一个元素是要么>50K<=50K我希望把它无论是age_over_dict还是age_under_dict,所以最后我应该为每个属性age_over_dict{59:79,Self-emp-inc:56}设置一个属性,因此对于59岁以上的人数以及超过50K的人数是79等等。我似乎无法得到这部分工作任何帮助将不胜感激提前感谢。这是代码,我此刻

def trainClassifier(f): 
     age_over = {} 
     age_under = {} 
     count = 0 
     count_over = 0 
     count_under = 0 
     for row in f: 
     row = row.split(", ") 
     count +=1 
     if row[-1]in f == " >50K": 
      if row[0] in f == age_over: 
       age_over +=1 
       count_over+=1 
      else: 
       age_over = age_over + 1 
       count_over+=1 
     print(age_over,count_over,count) 

     return age_over 
+0

如果和else分支做同样的事情。 – igon 2014-11-21 21:24:05

+2

你知道f ==“> 50K”'中的'row [-1]是什么吗? – 2014-11-21 21:27:02

回答

0

这应该做你所要求的:

def trainClassifier(f): 
    count = 0 
    count_over = 0 
    count_under = 0 

    age_over = {} 
    age_under = {} 
    for line in f: 
     row = [ x.strip() for x in line.split(",") ] 
     print row 
     count +=1 
     if int(row[0]) > 50: 
      dest_dict = age_over 
     else: 
      dest_dict = age_under 

     for attr in row: 
      if attr not in dest_dict: 
       dest_dict[attr] = 1 
      else: 
       dest_dict[attr] += 1 

    return age_over,age_under 

然而,重复的属性通知将被计算多次在CSV每个记录。不确定那是你想要的行为。

0

Counter from collections根据迭代创建直方图。

from collections import Counter 

首先,您需要筛选您想要的信息。在你的情况下,年龄,第一个元素和收入是最后一个元素。我在列表理解中抓住这些元素,并将结果传递给每个年龄段的收入对的计数器。

Counter([(i[0],i[-1]) for i in f]) 

下面是一个例子,列出了与[年龄,nonesense,收入]列表:

>>> a 
[[30, 1, '>50'], [59, 2, '<50'], [30, 3, '>50']] 

不仅仅是数据过滤功能的中间步骤,我们需要:

>>> b = [(i[0], i[-1]) for i in a] 
>>> b 
[(30, '>50'), (59, '<50'), (30, '>50')] 

并建立计数器的结果:

>>> c = Counter(b) 
>>> c 
Counter({(30, '>50'): 2, (59, '<50'): 1}) 

从这里,如果你想知道的人谁是30数量,并高于50K时,您可以使用c像一本字典:

>>> c[30,'>50'] 
2 
相关问题