使用带整数的列对文本文件的行进行排序 -

时间:2013-12-30 18:32:21

标签: python sorting numpy

我需要使用其中一列的整数值对文本文件的行进行排序 (第一个)。 文件(coord.xyz)看起来像这样

9  1  -1.379785  0.195902  -1.197553
5  4  -0.303549  0.242253  -0.810244
2  2  -0.582923  1.208243  1.566588
3  3  -0.494556  0.028594  0.763130
4  1  -0.749005  -1.209878  1.358057
1  1  -0.883509  1.111866  2.882335
6  1  -1.005786  -1.278486  2.719391
7  5  -1.128898  -0.088124  3.508042
10  1  -0.253070  -0.289294  5.424662
8  1  -1.243879  -0.217228  5.247915

我使用了代码

import numpy as np

with open("coord.xyz") as inf:
    data = []
    for line in inf:
        line = line.split()
        if len(line)==5:
            data.append(line)
f_h = file('sorted.dat','a')
m = sorted(data, key=lambda data_entry: data_entry[0])
np.savetxt(f_h, m, fmt='%s', delimiter='    ')
f_h.close()

sorted.dat文件就像这样

1    1    -0.883509    1.111866    2.882335
10    1    -0.253070    -0.289294    5.424662
2    2    -0.582923    1.208243    1.566588
3    3    -0.494556    0.028594    0.763130
4    1    -0.749005    -1.209878    1.358057
5    4    -0.303549    0.242253    -0.810244
6    1    -1.005786    -1.278486    2.719391
7    5    -1.128898    -0.088124    3.508042
8    1    -1.243879    -0.217228    5.247915
9    1    -1.379785    0.195902    -1.197553

10被视为小于2的值。 有人可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:4)

您所写的是将行排序为字符串。字母顺序10在2之前。

尝试将lambda写为:

m = sorted(data, key=lambda data_entry: int(data_entry[0]))

答案 1 :(得分:3)

如果您使用NumPy 导入数据以及导出,则不会出现此问题。例如:

m = np.loadtxt("coord.xyz", dtype="i, i, f8, f8, f8")

现在你已经得到了相应类型的一维元组数组,默认的m.sort()将以通常的方式对元组进行排序,这正是你想要的。所以整个事情减少到三行:读取数组,对数组进行排序,编写数组。


但是,让我们告诉你你的尝试做错了什么:

m = sorted(data, key=lambda data_entry: data_entry[0])

您要求它按字符串data_entry列表中的第一个字符串排序。这就是它的作用。如果您希望它按第一个字符串排序为数字,您必须告诉它。像这样:

m = sorted(data, key=lambda data_entry: int(data_entry[0]))

就是这样。


此外,如果您想在不使用NumPy的情况下读取(或写入)类似CSV的文件,而不是编写自己的字符串处理,标准库中的csv模块会让您更轻松:

with open("coord.xyz") as inf:
    data = list(csv.reader(inf, delimiter='    '))
m = sorted(data, key=lambda data_entry: int(data_entry[0]))
with open("sorted.dat", "a") as outf:
    csv.writer(outf, delimiter='    ').writerows(m)