Как отсортировать список буквенно-цифровых символов со сложными строками - PullRequest
0 голосов
/ 01 марта 2020

Мне нужна ваша помощь, потому что я застрял в этой проблеме. Я хочу отсортировать список, который состоит из уродливой строки в сочетании с целыми числами. Порядок, который мне нужен, следующий: начиная с

f(-2,-2)=..., 
f(-2,-1)=..., 
f(-2,0)=...,
f(-2,1)=...,
f(-2,2)=..., 
..., 
f(2,2)= ...

Я пытался использовать отсортированную встроенную функцию, но это не помогло. Может кто-нибудь помочь начинающему.

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

Ответы [ 4 ]

3 голосов
/ 01 марта 2020

Мы можем использовать комбинацию regex и пользовательской клавиши сортировки для достижения желаемого результата.

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))']
2 голосов
/ 01 марта 2020

Вы можете использовать модуль natsort Python, чтобы отсортировать этот список в соответствии с естественным порядком этих чисел со знаком.

Вы можете установить его, используя:

$ pip install natsort

(Хотя точные детали могут отличаться в зависимости от того, используете ли вы virtualenv, venv, pipenv и т. Д. c. Или вы работаете на платформе, где вам нужны дополнительные разрешения для установки модулей на платформе, в которой на случай, если вы захотите установить его в своем домашнем каталоге. Поищите в Интернете или в 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))']

Вы можете легко сортировать порядок соответствует вашему Заявленное ожидание.

1 голос
/ 01 марта 2020

Сначала найдите способ получить данные для сортировки из каждого элемента списка:

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

Это выведет хороший список пар чисел, так что findall работает. Выражение findall довольно просто, как регулярные выражения go, потому что все, что он делает, - находит последовательность f(<em>number</em>₁,<em>number</em>₂) в каждом элементе списка и возвращает кортеж (<em>number</em>₁,<em>number</em>₂). Это данные для сортировки.

При этом вы можете использовать кортеж в качестве входных данных для аргумента key в list.sort:

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)*(...
0 голосов
/ 01 марта 2020

Если вы хотите использовать встроенный sort, я думаю, что должна быть возможность разбить вашу строку на кортежи в соответствии с логикой сортировки c, которую вы хотите применить.

Вот generi c пример:

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, ")"] и так далее, в зависимости от того, как сложные ваши записи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...