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

Python 保持以前未排序列表中的值之间的关联?,python,algorithm,list,sorting,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:

我有一个文本文件,里面有化学元素的符号和它们相应的重量,比如:

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)
但是现在权重已经排序,我无法理解如何将符号正确地排序/映射到相应的权重。我曾考虑过使用字典,但我仍然不知道如何对它们进行排序,以便符号得到正确的顺序。

您可以使用函数

您可以阅读有关排序的更多信息

您可以使用函数


您可以阅读有关排序的更多内容。看起来您不能只对输入进行
split()
,因为空格不是分隔每一对,而是用值分隔名称。i、 e.
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']

您可以轻松地将此列表重新格式化为您需要的格式。

看起来您不能只对输入进行
split()
,因为空格不是分隔每一对,而是用值分隔名称。i、 e.
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']

您可以轻松地将此列表重新格式化为所需格式。

如果您的数据实际上由空格分隔,您可以创建一个dict并对项目进行排序:

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])))))

如果数据实际上由空格分隔,则可以创建dict并对项目进行排序:

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])))))


在这种情况下,正则表达式是一个非常好的主意,但是你能用字符串解释你的模式吗?@elegent,你用字符串解释模式是什么意思?啊,对不起,我指的是你传递给
findall()
函数的模式(
'[^]+\d+\.\d+'
):)当然我不喜欢正则表达式的地方是正则表达式的不可读性。所以我搜索任何非空格字符一次或多次,后跟空格,后跟浮点数。非空格字符强制每个匹配只包含一个空格,因此每个匹配必须是一个名称、值对,例如
Al 26.98
。谢谢:)你说得对,它们不可读,但也非常强大:)正则表达式在这种情况下是一个非常好的主意,但是你能用字符串解释你的模式吗?@elegent,用字符串解释模式是什么意思?啊,对不起,我指的是您传递给
findall()
函数(
'[^]+\d+\.\d+'
)的模式:)当然我不喜欢正则表达式的地方是正则表达式的不可读性。所以我搜索任何非空格字符一次或多次,后跟空格,后跟浮点数。非空格字符强制每个匹配只包含一个空格,因此每个匹配必须是一个名称、值对,例如
Al 26.98
。谢谢:)你是对的,它们不可读,但也非常强大:)为什么
Ac
是独立的?你写了自己的排序代码吗?不要那样做。使用内置库
排序
(或
排序
,如果您想要一个单独的新列表)。根据您提供的内容,我不知道如何
如果列表索引(部分)%2=0:
分离数据它取出重量并将其放在一个单独的列表中(没有化学元素的符号)。如果一行是
Ac 227.0Ag 107.868Al 26.98154Am 241.1
,它怎么能做到这一点?您的文件中它们之间是否有空格?为什么
Ac
是独立的?您是否编写了自己的排序代码?不要那样做。使用内置库
排序
(或
排序
,如果您想要一个单独的新列表)。根据您提供的内容,我不知道如何
如果列表索引(部分)%2=0:
分离数据它取出重量并将其放在一个单独的列表中(没有化学元素的符号)。如果一行是
Ac 227.0Ag 107.868Al 26.98154Am 241.1
,它怎么能做到这一点?在你的文件中它们之间有空格吗?