所以,我有这个文本文件,其中包含化学元素及其相应权重的符号,如:
Ac 227.0Ag 107.868Al 26.98154Am 241.1
...等等
我想要做的是根据重量而不是字母顺序对其进行排序。 我的第一次尝试是创建一个只有权重的列表,然后使用mergesort算法以数字方式对其进行排序。为此,我使用了代码:
atomdata=open('atomdata.txt').read()
alist=atomdata.split()
weightlist=[]
for part in alist:
if alist.index(part)%2!=0:
weight=part
weightlist.append(float(weight))
sortweight=mergesort(weightlist)
但是现在权重已经排序,我无法弄清楚如何正确地将符号排序/映射到相应的权重。我曾经考虑过使用字典,但我仍然不知道如何对它们进行排序,以便标志得到正确的顺序。
答案 0 :(得分:0)
您可以使用sorted
功能
>>> elements = "22Ac 227.0Ag 107.868Al 26.98154Am 241.1Ar"
>>> sorted(elements.split(), key=lambda x: float(x[:-2]))
['22Ac', '26.98154Am', '107.868Al', '227.0Ag', '241.1Ar']
您可以阅读有关排序here
的更多信息答案 1 :(得分:0)
看起来你不能只输入split()
,因为空格不是将每一对分开,而是将名称与值分开。即Ac
对应227.0
,Ag
对应107.86
。
一个解决方案是:
import re
weights = re.findall('[^ ]+ \d+\.\d+', input)
weights.sort(key=lambda x: float(x.split(" ")[1]))
输入
Ac 227.0Ag 107.868Al 26.98154Am 241.1Ar
这导致
['Al 26.98154', 'Ag 107.868', 'Ac 227.0', 'Am 241.1']
您可以轻松地将此列表重新格式化为您需要的任何内容。
答案 2 :(得分:0)
如果您的数据实际上是由空格分隔的,您可以创建一个字典并对项目进行排序:
with open('atomdata.txt') as f:
it = iter(f.read().split())
d = dict(zip(it,it))
print(sorted(d.items(),key=lambda x: float(x[1])))
使用您的示例行:
s ="Ac 227.0 Ag 107.868 Al 26.98154 Am 241.1"
it = iter(s.split())
d = dict(zip(it,it))
print(sorted(d.items(),key=lambda x: float(x[1])))
[('Al', '26.98154'), ('Ag', '107.868'), ('Ac', '227.0'), ('Am', '241.1')]
你可以使用itertools.chain:
在不将所有内容读入内存的情况下完成from itertools import chain
with open('atomdata.txt') as f:
it = chain.from_iterable(line.split() for line in f)
d = dict(zip(it,it))
print(sorted(d.items(),key=lambda x: float(x[1])))
如果你真的想要一个列表中的项目,你可以链接结果:
print(list(chain.from_iterable(sorted(d.items(),key=lambda x: float(x[1])))))