我需要使用其中一列的整数值对文本文件的行进行排序
(第一个)。
文件(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
的值。
有人可以帮我解决这个问题吗?
答案 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)