Как отсортировать 2-й массив по строке в Python?

У меня есть 2-й массив, размер 3x10, и я хочу отсортировать по значениям в 2-й строке от самого низкого до самого высокого значения.

17
задан Cœur 16 November 2018 в 03:58
поделиться

4 ответа

Мой первоначальный, хотя у вас есть опечатка во имя исключения, которое вы ловите/бросаете, но если ваш код точно такой же, я не уверен, что именно происходит.

Попробуйте внести следующие изменения в исходный сценарий и вставьте результаты. Это поможет диагностировать проблему немного лучше.

<?php

//set up exception handler to report what we didn't catch
function exception_handler($exception) {

    if($exception instanceof MyException) {
        echo "you didn't catch a myexception instance\n";

    } else if($exception instanceof Exception) {
        echo "you didn't catch a exception instance\n";

    } else {
        echo "uncaught exception of type: ".gettype($exception)."\n";
    }

    echo "Uncaught exception: " , $exception->getMessage(), "\n";
}

//install the handler
set_exception_handler('exception_handler');

class MyException extends Exception {
}

function inverse($x) {
    if (!$x) {
        throw new MyException('Division by zero.');
    }
    else return 1/$x;
}

try {
    echo inverse(5) . "\n";
    echo inverse(0) . "\n";
} catch (MyException $e) {
    echo 'Caught myexception: ',  $e->getMessage(), "\n";
} catch (Exception $e) {
    echo 'Caught exception: ',  $e->getMessage(), "\n";
}

// Continue execution
echo 'Hello World';
?>
-121--812748-

Ну, если вы говорите о стандартных списках питонов, это легко: mylist [1] .sort () . Например,

>>> from random import randint
>>> a_list = [[randint(1,15) for _ in range(10)] for _ in range(3)]
>>> print a_list
[[3, 12, 3, 12, 13, 5, 12, 2, 1, 13], [3, 8, 7, 4, 6, 11, 15, 12, 4, 6], [15, 3, 8, 15, 1, 6, 4, 7, 15, 14]]
>>> a_list[1].sort()
>>> print a_list
[[3, 12, 3, 12, 13, 5, 12, 2, 1, 13], [3, 4, 4, 6, 6, 7, 8, 11, 12, 15], [15, 3, 8, 15, 1, 6, 4, 7, 15, 14]]
-121--1704962-

Python, per se, не имеет «2d array» - он имеет (1d) перечислять в качестве встроенных и (1d) массивов в стандартном библиотечном модуле array . Существуют библиотеки сторонних производителей, такие как numpy , которые действительно предоставляют многомерные массивы, пригодные для использования в Python, но, конечно, вы бы упомянули такие библиотеки сторонних производителей, если бы вы использовали некоторые из них, а не просто говорили «в Python», правильно ? -)

Поэтому я предполагаю, что под «2D массивом» вы подразумеваете список, такой

lol = [ range(10), range(2, 12), range(5, 15) ]

или тому подобное, т.е. список с 3 элементами, причем каждый элемент является списком с 10 элементами, и «вторая строка» будет элементом подсписка lol [1] . Да, много предположений, но ваш вопрос настолько безумно расплывчат, что нет пути избежать предположений - отредактируйте свой Q, чтобы уточнить с большей точностью, и пример!, если вы не любите людей, пытающихся прочитать ваш ум (и, возможно, неудачу), так как в настоящее время вы делаете невозможным избежать.

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

indices = range(10)
indices.sort(key = lol[1].__getitem__)
for i, sublist in enumerate(lol):
  lol[i] = [sublist[j] for j in indices]

Общий подход здесь состоит в том, чтобы отсортировать диапазон индексов, а затем просто использовать этот соответствующим образом отсортированный диапазон, чтобы переупорядочить все сублисты в игре.

Если у вас на самом деле другая проблема, конечно, будут разные решения; -).

20
ответ дан 30 November 2019 в 10:22
поделиться

Как выглядит ваш «2D Array»?

Например:

>>> a = [
     [12, 18, 6, 3], 
     [ 4,  3, 1, 2], 
     [15,  8, 9, 6]
]
>>> a.sort(key=lambda x: x[1])
>>> a
[[4,  3,  1, 2], 
 [15, 8,  9, 6], 
 [12, 18, 6, 3]]

Но я думаю, вы хотите что-то вроде этого:

>>> a = [
     [12, 18, 6, 3], 
     [ 4,  3, 1, 2], 
     [15,  8, 9, 6]
]
>>> a = zip(*a)
>>> a.sort(key=lambda x: x[1])
>>> a
[(6,  1,  9), 
 (3,  2,  6), 
 (18, 3,  8), 
 (12, 4, 15)]
>>> a = zip(*a)
>>> a
[(6, 3, 18, 12), 
 (1, 2,  3,  4), 
 (9, 6,  8, 15)
]
30
ответ дан 30 November 2019 в 10:22
поделиться

Ну, если вы говорите о стандартных списках Python, это легко: MyList [1] .sort () . Например:

>>> from random import randint
>>> a_list = [[randint(1,15) for _ in range(10)] for _ in range(3)]
>>> print a_list
[[3, 12, 3, 12, 13, 5, 12, 2, 1, 13], [3, 8, 7, 4, 6, 11, 15, 12, 4, 6], [15, 3, 8, 15, 1, 6, 4, 7, 15, 14]]
>>> a_list[1].sort()
>>> print a_list
[[3, 12, 3, 12, 13, 5, 12, 2, 1, 13], [3, 4, 4, 6, 6, 7, 8, 11, 12, 15], [15, 3, 8, 15, 1, 6, 4, 7, 15, 14]]
1
ответ дан 30 November 2019 в 10:22
поделиться

, а не используют лямбда x: x [1] Вы можете использовать оператор. Itemgetter в качестве ключа в сортировку или Сортированные функции. itemgetter (n) создает функцию, которая получает n-й пункт из списка.

>>> matrix = [ [4,5,6], [1,2,3], [7,0,9]]
>>> from operator import itemgetter
>>> sorted(matrix, key=itemgetter(1))
[[7, 0, 9], [1, 2, 3], [4, 5, 6]]
6
ответ дан 30 November 2019 в 10:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: