保持以前未排序的列表中的值之间的关联吗?

时间:2015-07-03 08:35:33

标签: python algorithm list sorting

所以,我有这个文本文件,其中包含化学元素及其相应权重的符号,如:

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)

但是现在权重已经排序,我无法弄清楚如何正确地将符号排序/映射到相应的权重。我曾经考虑过使用字典,但我仍然不知道如何对它们进行排序,以便标志得到正确的顺序。

3 个答案:

答案 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.0Ag对应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])))))