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
中再次使用它呢?如果没有,请解释。