4 回答
TA贡献1824条经验 获得超5个赞
我们可以使用正则表达式和自定义排序键的组合来实现所需的结果。
import ast
import re
pattern = re.compile('\([+-]?[0-9]*,[+-]?[0-9]*\)')
def custom_sort(item):
match = pattern.search(item).group(0)
x, y = ast.literal_eval(match)
return x, y
sorted(list1, key=custom_sort)
['f(-2,-2) = 0',
'f(-2,-1) = 0',
'f(-2,0) = 0',
'f(-2,1) = scalar2_qp_1211(0,1)*(((d)*p11^2+((2*d+4)*m10^2+(-2*d)*m4^2)*p11+(d)*m10^4+((-2*d)*m4^2)*m10^2+(d)*m4^4)*den(d))',
'f(-2,2) = scalar2_qp_1211(0,1)*(((d-2)*p11^2+((2*d+4)*m10^2+(-2*d+4)*m4^2)*p11+(d+2)*m10^4+((-2*d)*m4^2)*m10^2+(d-2)*m4^4)*den(2*m10^2))',
'f(-1,-2) = 0',
'f(-1,-1) = 0',
'f(-1,0) = 0',
'f(-1,1) = scalar2_qp_1211(0,1)*(p11+m10^2-m4^2)',
'f(-1,2) = scalar2_qp_1211(0,1)*(((d-2)*p11+(d)*m10^2+(-d+2)*m4^2)*den(2*m10^2))',
'f(0,-2) = 0',
'f(0,-1) = 0',
'f(0,0) = 0',
'f(0,1) = scalar2_qp_1211(0,1)*(1)',
'f(0,2) = scalar2_qp_1211(0,1)*((d-2)*den(2*m10^2))',
'f(1,-2) = scalar2_qp_016(1,0)*(((d)*p11^2+((-2*d)*m10^2+(2*d+4)*m4^2)*p11+(d)*m10^4+((-2*d)*m4^2)*m10^2+(d)*m4^4)*den(d))',
'f(1,-1) = scalar2_qp_016(1,0)*(p11-m10^2+m4^2)',
'f(1,0) = scalar2_qp_016(1,0)*(1)',
'f(1,1) = scalar2_qp_1216(1,1)*(1)',
'f(1,2) = scalar2_qp_016(1,0)*((d-2)*den(p11^2+(-2*m10^2-2*m4^2)*p11+m10^4+(-2*m4^2)*m10^2+m4^4))',
'f(2,-2) = scalar2_qp_016(1,0)*(((d-2)*p11^2+((-2*d+4)*m10^2+(2*d+4)*m4^2)*p11+(d-2)*m10^4+((-2*d)*m4^2)*m10^2+(d+2)*m4^4)*den(2*m4^2))',
'f(2,-1) = scalar2_qp_016(1,0)*(((d-2)*p11+(-d+2)*m10^2+(d)*m4^2)*den(2*m4^2))',
'f(2,0) = scalar2_qp_016(1,0)*((d-2)*den(2*m4^2))',
'f(2,1) = scalar2_qp_016(1,0)*(((d-2)*p11+(-d+2)*m10^2+(-d+2)*m4^2)*den((2*m4^2)*p11^2+((-4*m4^2)*m10^2-4*m4^4)*p11+(2*m4^2)*m10^4+(-4*m4^4)*m10^2+2*m4^6))',
'f(2,2) = scalar2_qp_016(1,0)*(((d-2)*p11^2+((-2*d+4)*m10^2+(-2*d^2+12*d-16)*m4^2)*p11+(d-2)*m10^4+((-2*d^2+12*d-16)*m4^2)*m10^2+(2*d^2-13*d+18)*m4^4)*den((2*m4^2)*p11^4+((-8*m4^2)*m10^2-8*m4^4)*p11^3+((12*m4^2)*m10^4+(8*m4^4)*m10^2+12*m4^6)*p11^2+((-8*m4^2)*m10^6+(8*m4^4)*m10^4+(8*m4^6)*m10^2-8*m4^8)*p11+(2*m4^2)*m10^8+(-8*m4^4)*m10^6+(12*m4^6)*m10^4+(-8*m4^8)*m10^2+2*m4^10))']
TA贡献1803条经验 获得超3个赞
您可以使用 natsort Python 模块根据这些有符号数字的自然排序对此列表进行排序。
您可以使用以下命令进行安装:
$ pip install natsort
(虽然确切的细节可能会有所不同,但你是否正在使用virtualenv,venv,pipenv等。或者,无论您是否在需要额外权限才能在平台上安装模块的平台上,在这种情况下,您可以考虑将其安装在主目录中。搜索Web或StackOverflow,您肯定会找到有关如何为您的设置安装Python模块的帖子。
安装后,您可以使用以下命令导入它:
from natsort import natsorted, ns
然后,您可以使用以下命令对列表进行排序:
natsorted(list1, alg=ns.SIGNED)
它产生:
['f(-2,-2) = 0',
'f(-2,-1) = 0',
'f(-2,0) = 0',
'f(-2,1) = scalar2_qp_1211(0,1)*(((d)*p11^2+((2*d+4)*m10^2+(-2*d)*m4^2)*p11+(d)*m10^4+((-2*d)*m4^2)*m10^2+(d)*m4^4)*den(d))',
'f(-2,2) = scalar2_qp_1211(0,1)*(((d-2)*p11^2+((2*d+4)*m10^2+(-2*d+4)*m4^2)*p11+(d+2)*m10^4+((-2*d)*m4^2)*m10^2+(d-2)*m4^4)*den(2*m10^2))',
'f(-1,-2) = 0',
'f(-1,-1) = 0',
'f(-1,0) = 0',
'f(-1,1) = scalar2_qp_1211(0,1)*(p11+m10^2-m4^2)',
'f(-1,2) = scalar2_qp_1211(0,1)*(((d-2)*p11+(d)*m10^2+(-d+2)*m4^2)*den(2*m10^2))',
'f(0,-2) = 0',
'f(0,-1) = 0',
'f(0,0) = 0',
'f(0,1) = scalar2_qp_1211(0,1)*(1)',
'f(0,2) = scalar2_qp_1211(0,1)*((d-2)*den(2*m10^2))',
'f(1,-2) = scalar2_qp_016(1,0)*(((d)*p11^2+((-2*d)*m10^2+(2*d+4)*m4^2)*p11+(d)*m10^4+((-2*d)*m4^2)*m10^2+(d)*m4^4)*den(d))',
'f(1,-1) = scalar2_qp_016(1,0)*(p11-m10^2+m4^2)',
'f(1,0) = scalar2_qp_016(1,0)*(1)',
'f(1,1) = scalar2_qp_1216(1,1)*(1)',
'f(1,2) = scalar2_qp_016(1,0)*((d-2)*den(p11^2+(-2*m10^2-2*m4^2)*p11+m10^4+(-2*m4^2)*m10^2+m4^4))',
'f(2,-2) = scalar2_qp_016(1,0)*(((d-2)*p11^2+((-2*d+4)*m10^2+(2*d+4)*m4^2)*p11+(d-2)*m10^4+((-2*d)*m4^2)*m10^2+(d+2)*m4^4)*den(2*m4^2))',
'f(2,-1) = scalar2_qp_016(1,0)*(((d-2)*p11+(-d+2)*m10^2+(d)*m4^2)*den(2*m4^2))',
'f(2,0) = scalar2_qp_016(1,0)*((d-2)*den(2*m4^2))',
'f(2,1) = scalar2_qp_016(1,0)*(((d-2)*p11+(-d+2)*m10^2+(-d+2)*m4^2)*den((2*m4^2)*p11^2+((-4*m4^2)*m10^2-4*m4^4)*p11+(2*m4^2)*m10^4+(-4*m4^4)*m10^2+2*m4^6))',
'f(2,2) = scalar2_qp_016(1,0)*(((d-2)*p11^2+((-2*d+4)*m10^2+(-2*d^2+12*d-16)*m4^2)*p11+(d-2)*m10^4+((-2*d^2+12*d-16)*m4^2)*m10^2+(2*d^2-13*d+18)*m4^4)*den((2*m4^2)*p11^4+((-8*m4^2)*m10^2-8*m4^4)*p11^3+((12*m4^2)*m10^4+(8*m4^4)*m10^2+12*m4^6)*p11^2+((-8*m4^2)*m10^6+(8*m4^4)*m10^4+(8*m4^6)*m10^2-8*m4^8)*p11+(2*m4^2)*m10^8+(-8*m4^4)*m10^6+(12*m4^6)*m10^4+(-8*m4^8)*m10^2+2*m4^10))']
您可以轻松地将排序顺序与您声明的期望相匹配。
TA贡献2011条经验 获得超2个赞
首先找到一种方法来获取要从每个列表项中排序的数据:
import re
list1 = ['f(-2,-2) = 0', 'f(-2,-1) = 0', 'f(-2,0) = 0', 'f(-1,-2) = 0', 'f(-1,-1) = 0', 'f(-1,0) = 0', 'f(0,-2) = 0', 'f(0,-1) = 0', 'f(-2,1) = scalar2_qp_1211(0,1)*(((d)*p11^2+((2*d+4)*m10^2+(-2*d)*m4^2)*p11+(d)*m10^4+((-2*d)*m4^2)*m10^2+(d)*m4^4)*den(d))', 'f(-2,2) = scalar2_qp_1211(0,1)*(((d-2)*p11^2+((2*d+4)*m10^2+(-2*d+4)*m4^2)*p11+(d+2)*m10^4+((-2*d)*m4^2)*m10^2+(d-2)*m4^4)*den(2*m10^2))', 'f(-1,1) = scalar2_qp_1211(0,1)*(p11+m10^2-m4^2)', 'f(-1,2) = scalar2_qp_1211(0,1)*(((d-2)*p11+(d)*m10^2+(-d+2)*m4^2)*den(2*m10^2))', 'f(0,1) = scalar2_qp_1211(0,1)*(1)', 'f(0,2) = scalar2_qp_1211(0,1)*((d-2)*den(2*m10^2))', 'f(1,-2) = scalar2_qp_016(1,0)*(((d)*p11^2+((-2*d)*m10^2+(2*d+4)*m4^2)*p11+(d)*m10^4+((-2*d)*m4^2)*m10^2+(d)*m4^4)*den(d))', 'f(1,-1) = scalar2_qp_016(1,0)*(p11-m10^2+m4^2)', 'f(1,0) = scalar2_qp_016(1,0)*(1)', 'f(1,1) = scalar2_qp_1216(1,1)*(1)', 'f(1,2) = scalar2_qp_016(1,0)*((d-2)*den(p11^2+(-2*m10^2-2*m4^2)*p11+m10^4+(-2*m4^2)*m10^2+m4^4))', 'f(2,-2) = scalar2_qp_016(1,0)*(((d-2)*p11^2+((-2*d+4)*m10^2+(2*d+4)*m4^2)*p11+(d-2)*m10^4+((-2*d)*m4^2)*m10^2+(d+2)*m4^4)*den(2*m4^2))', 'f(2,-1) = scalar2_qp_016(1,0)*(((d-2)*p11+(-d+2)*m10^2+(d)*m4^2)*den(2*m4^2))', 'f(2,0) = scalar2_qp_016(1,0)*((d-2)*den(2*m4^2))', 'f(2,1) = scalar2_qp_016(1,0)*(((d-2)*p11+(-d+2)*m10^2+(-d+2)*m4^2)*den((2*m4^2)*p11^2+((-4*m4^2)*m10^2-4*m4^4)*p11+(2*m4^2)*m10^4+(-4*m4^4)*m10^2+2*m4^6))', 'f(2,2) = scalar2_qp_016(1,0)*(((d-2)*p11^2+((-2*d+4)*m10^2+(-2*d^2+12*d-16)*m4^2)*p11+(d-2)*m10^4+((-2*d^2+12*d-16)*m4^2)*m10^2+(2*d^2-13*d+18)*m4^4)*den((2*m4^2)*p11^4+((-8*m4^2)*m10^2-8*m4^4)*p11^3+((12*m4^2)*m10^4+(8*m4^4)*m10^2+12*m4^6)*p11^2+((-8*m4^2)*m10^6+(8*m4^4)*m10^4+(8*m4^6)*m10^2-8*m4^8)*p11+(2*m4^2)*m10^8+(-8*m4^4)*m10^6+(12*m4^6)*m10^4+(-8*m4^8)*m10^2+2*m4^10))', 'f(0,0) = 0']
for item in list1:
print ([(i[0],i[1]) for i in re.findall(r'^f\((-?\d+),(-?\d+)\)', item)])
这打印出一个很好的数字对列表,所以这有效。与正则表达式一样,该表达式非常简单,因为它所做的就是在每个列表项中找到一个序列并返回一个元组。这是要排序的数据。findallfindallf(number₁,number₂)(number₁,number₂)
这样,您就可以将元组用作 list.sort 中参数的输入:key
for i in sorted(list1, key=lambda item: [(int(i[0]),int(i[1])) for i in [(i[0],i[1]) for i in re.findall(r'f\((-?\d+),(-?\d+)\)', item)]]):
print (i)
结果如下:
f(-2,-2) = 0
f(-2,-1) = 0
f(-2,0) = 0
f(-2,1) = scalar2_qp_1211(0,1)...
f(-2,2) = scalar2_qp_1211(0,1)...
f(-1,-2) = 0
f(-1,-1) = 0
f(-1,0) = 0
f(-1,1) = scalar2_qp_1211(0,1)...
f(-1,2) = scalar2_qp_1211(0,1)...
f(0,-2) = 0
f(0,-1) = 0
f(0,0) = 0
f(0,1) = scalar2_qp_1211(0,1)*...
f(0,2) = scalar2_qp_1211(0,1)*...
f(1,-2) = scalar2_qp_016(1,0)*...
f(1,-1) = scalar2_qp_016(1,0)*...
f(1,0) = scalar2_qp_016(1,0)*(...
f(1,1) = scalar2_qp_1216(1,1)*...
f(1,2) = scalar2_qp_016(1,0)*(...
f(2,-2) = scalar2_qp_016(1,0)*...
f(2,-1) = scalar2_qp_016(1,0)*...
f(2,0) = scalar2_qp_016(1,0)*(...
f(2,1) = scalar2_qp_016(1,0)*(...
f(2,2) = scalar2_qp_016(1,0)*(...
TA贡献1825条经验 获得超6个赞
如果你想使用内置的,我认为应该可以根据你想要应用的排序逻辑将你的字符串拆分成元组。sort
下面是一个通用示例:
a = [("c", 2), ("a", 2), ("a", 1), ("b", 4)] print(sorted(a))
这打印:
[('a', 1), ('a', 2), ('b', 4), ('c', 2)]
在您的情况下,您可以拆分为 ,依此类推,具体取决于您的条目的复杂程度。"f(-2,1)"
["f(", -2, ",", 1, ")"]
添加回答
举报