Python - 如何存储数值行?

时间:2011-06-27 10:40:28

标签: python

我有一个包含多行的文件,每行有超过20个数值,例如:

123 1 18 180776 4303656 1605 16468 0 51429 24230 0 0 0 4 8 0 8710 14705 1836 1 4 95
0 24538 0 187860 4264028 449 4711 0 2537 2537 0 0 5 0 0 0 6138 12880 1590 1 22 76
...

我想:

  1. 读一行
  2. 将它保存在某些python数据类型中(什么是最好的?)
  3. 对从上面一行中取得的每个数字进行一些操作,例如:
    • 检查它是否不高于某些(并保存结果)
    • 检查它是否不在......(并保存结果)
    • 计算其长度(位数)(并保存结果)
    • 将其与同一列中的前一个数字进行比较
    • -
  4. 所以在一行(带数字)后我应该:

    1. 存储每个号码
    2. 为每个号码存储其他属性
    3. 将每个数字与同一列中的前一个数字进行比较,存储结果但我可以忘记上一行。

      哪种数据类型最适合存储在数据之上?

4 个答案:

答案 0 :(得分:4)

通常你会使用list作为

当您在变量中读取一行时,请说出row

row.split() 

会给你一个list,但每个元素都是一个字符串,你需要数字。你可以使用像这样的列表理解来获得一个数字列表(看起来它们都是整数)

[int(x) for x in row.split()]

您还可以使用列表推导与sth

进行比较

这只会过滤掉<某物

[int(x) for x in row.split() if int(x)<sth]

这将返回bool的列表,其中True表示相应的项目是&lt; sth

[int(x)<sth for x in row.split()]

答案 1 :(得分:2)

如果不了解您将如何处理汇总信息,很难说哪种数据类型最佳。但是,一个简单的解决方案是使用每行的列表,包含带有实际数字的2元组和带有属性的字典:

line = [(1, {'even': False, 'foo': 'bar'}), ..., (2332, {'even': True, 'foo': 'baz'}), ...]

以下是如何从一行文字开始获取此列表:

line = "4 0 2837 9323 ..."
line = [(int(n), dict()) for n in line.split()]

然后迭代列表并设置属性:

for n, attributes in line:
    ...
    attributes['foo'] = 'bar'

答案 2 :(得分:0)

标准数据类型应该适用于大多数用途:即listtuple。如果您要就地更改值,请使用list

你应该可以做这样的事情(未经测试的代码):

all_the_lines = []
with open("filename.txt", 'r') as f:
    for line in f:
        data = [int(x) for x in line.split()]
        # do something with the data if you want
        all_the_lines.append(data)

在此之后,all_the_lines将保存listlist个原始数据(转换为整数)。您需要弄清楚如何保存要保存的其他信息:例如,指向超过特定数字的所有元素的指针。您可以在上面或之后的循环中计算所有这些。

如果您想对数字执行重要的数学计算(听起来不是这样),请考虑使用array包中的numpy来代替。

答案 3 :(得分:0)