2013-04-26 25 views
1

我现在正在为一个项目编写一些代码,其基本思想是逐行读取文件中的内容并记录下每个数值都包含在内。对于未来的分析,重要的是要了解每条线上有多少值以及每条线出现的频率,因此我不能将该文件视为“数字包”并只计算其总数。使用python生成一个字符串中包含的数值的索引

我最初的想法是生成一个空列表,并且对于每个远处的列表中的数字索引(数字10将在valueList [10]等等),然后为该值的每个事件增加该位置的值“10”。我很容易就可以在线计数器上捕获这些信息,并且还可以逐行给出数据。

我(显然)是Python的新手。我熟悉其他语言,但以前主要完成嵌入式编程,所以我对高级函数不熟悉等等。有没有比我所描述的“最佳实践”或更可靠的方法来做到这一点?

干杯, 将

+0

我检查数字的格式如下:116 104 105 115 32 109 97 107 101 115 32 105 116 32 111 102 102 105 99 105 97 108 44 32 119 104 105 99 104 32 105 115 32 115 111 32 103 114 101 97 116 46 32 10这是一条线......线是不同的长度取决于微控制器输出到日志文件的内容 – willanth 2013-04-26 11:03:32

回答

1

字典会更加适合这里,使用collections.Counter()。使用list不是一个好主意,因为您可能不知道文本文件中存在多少个唯一的数字,并且如果数字丢失,可能会导致稀疏列表。

例子:

In [16]: text="""1      
2 
3 
4 
5 
5 
1 
2 
5 
3""" 

In [17]: from collections import Counter 

In [18]: c=Counter()  

In [19]: for num in text.splitlines():  
    c[num]+=1 
    ....:  

In [20]: c 
Out[20]: Counter({'5': 3, '1': 2, '3': 2, '2': 2, '4': 1}) 
+0

'c = Counter(text.splitlines())' – eumiro 2013-04-26 09:30:17

0

这将是更易于使用的字典不是一个列表...

def inc_count(d, number): 
    try: 
     d[number] += 1 
    except KeyError: 
     d[number] = 1 

def dump_counts(d): 
    for k in sorted(d): 
     print 'Number %d occurred %d times' % (k, d[k]) 

>>> d = {} 
>>> inc_count(d, 10) 
>>> inc_count(d, 10) 
>>> inc_count(d, 11) 
>>> dump_counts(d) 
Number 10 occurred 2 times 
Number 11 occurred 1 times 
+0

我正在做这个建议工作的过程中,因为当我使用text.split()分割字符串以获取数字字符串的单个字符时,它们将出现字符串而不是整数。但在最初的测试中,这似乎是迄今为止最好的解决方案。非常感谢你的帮助。 – willanth 2013-04-26 12:37:05

相关问题