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

Python 使用带整数的列对文本文件的行进行排序-,python,sorting,numpy,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

我需要使用其中一列的整数值对文本文件的行进行排序 (第一个)。 文件(
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
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
我用了密码

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
文件的结果如下

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
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
的值。
有人能帮我解决这个问题吗?

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

尝试将lambda编写为:

m = sorted(data, key=lambda data_entry: int(data_entry[0]))
如果您使用NumPy来导入和导出数据,就不会有这个问题。例如:

m = np.loadtxt("coord.xyz", dtype="i, i, f8, f8, f8")
现在您已经有了一个适当类型的1D元组数组,默认的
m.sort()
将以通常的方式对元组进行排序,这正是您想要的。所以整个过程简化为三行:读取数组,排序数组,写入数组


但让我们向您展示一下您的尝试有哪些错误:

m = sorted(data, key=lambda data_entry: data_entry[0])
您要求它按照字符串列表中的第一个字符串进行排序
data\u entry
。这就是它的作用。如果你想让它按照第一个字符串作为数字排序,你必须告诉它。像这样:

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


此外,如果您希望在不使用NumPy的情况下读取(或写入)类似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)

作为旁注,看起来您是在从随机位置复制和粘贴代码位,而没有试图理解它们。例如,您知道靠近顶部的
with
语句的作用吗?如果是这样的话,为什么您不在
f\u h
中再次使用它呢?如果没有,请解释。