У меня есть 2-й массив, размер 3x10, и я хочу отсортировать по значениям в 2-й строке от самого низкого до самого высокого значения.
Мой первоначальный, хотя у вас есть опечатка во имя исключения, которое вы ловите/бросаете, но если ваш код точно такой же, я не уверен, что именно происходит.
Попробуйте внести следующие изменения в исходный сценарий и вставьте результаты. Это поможет диагностировать проблему немного лучше.
<?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]
Общий подход здесь состоит в том, чтобы отсортировать диапазон индексов, а затем просто использовать этот соответствующим образом отсортированный диапазон, чтобы переупорядочить все сублисты в игре.
Если у вас на самом деле другая проблема, конечно, будут разные решения; -).
Как выглядит ваш «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)
]
Ну, если вы говорите о стандартных списках 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]]
, а не используют лямбда 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]]