Учитывая:
data=['Elm11', 'Elm12', 'Elm2', 'elm0', 'elm1', 'elm10', 'elm13', 'elm9']
Подобно решению SergO, 1-линейный без внешних библиотек будет:
data.sort(key=lambda x : int(x[3:]))
или
sorted_data=sorted(data, key=lambda x : int(x[3:]))
Объяснение:
Это решение использует функцию функции sort для определения функции, которая будет использоваться для сортировки. Поскольку нам известно, что каждой записи данных предшествует «elm», функция сортировки преобразует в целую часть строки после третьего символа (т. Е. Int (x [3:])). Если числовая часть данных находится в другом месте, то эта часть функции должна измениться.
Приветствия
Конкретный вопрос, который у меня возникает, заключается в том, как создать макрос, который принимает в качестве аргумента функцию с более чем одним параметром, где первый параметр определенного типа предоставляет этот аргумент для первого функция.
blockquote>Макросы (даже процедурные макросы) работают с синтаксическими деревьями, поэтому они не могут изменять свое поведение в зависимости от семантики, включая типы и функции функций. Это означает, что для каждого возможного числа аргументов вам потребуется отдельный макрос. Например:
macro_rules! curry1 { ($func: ident, $($arg: expr),*) => { |a| $func($($arg),*, a) } } macro_rules! curry2 { ($func: ident, $($arg: expr),*) => { |a, b| $func($($arg),*, a, b) } } macro_rules! curry3 { ($func: ident, $($arg: expr),*) => { |a, b, c| $func($($arg),*, a, b, c) } }
Что будет использоваться следующим образом:
fn f(a: i32, b: i32, c: i32) -> i32 { a + b + c } fn main() { // requires 2 extra args let f_2 = curry2!(f, 2); // requires 1 extra arg let f_2_1 = curry1!(f, 2, 1); println!("{}", f(2, 1, 3)); // 6 println!("{}", f_2(1, 3)); // 6 println!("{}", f_2_1(3)); // 6 }