Сортировать словарь из 2d списка по первым значениям - PullRequest
1 голос
/ 06 апреля 2020

Я пытаюсь отсортировать файлы данных, используя структуру словаря. Таким образом, я бы отсортировал свой словарь по содержанию его первого значения, например, по первой строке / столбцу значения словаря.

Проблема, с которой я сталкиваюсь, заключается в том, что при использовании лямбды для сортировки словаря это не принять лямбда item:item[1], который, как я считаю, соответствует значению original_dict. К настоящему времени вот что у меня есть:

original_dict = {'file1.txt': array([[ 9., 40., 50., 20.],[10., 40., 50., 20.]]), 
                 'file2.txt':array([[1., 2., 3., 4.],[2., 2., 3., 4.]]), 
                 'file3.txt': array([[0.1, 0.2, 0.3, 0.4],[0.2, 0.2, 0.3, 0.4]])}

d2 = {k: v for k, v in sorted(original_dict.items(), key=lambda item: item[1])}

Возвращает

ValueError: Значение истинности массива с более чем одним элементом неоднозначно. Используйте a.any () или a.all ()

Желаемый вывод

d2 = {'file3.txt': array([[0.1, 0.2, 0.3, 0.4],[0.2, 0.2, 0.3, 0.4]]), 
      'file2.txt':array([[1., 2., 3., 4.],[2., 2., 3., 4.]]), 
      'file1.txt': array([[ 9., 40., 50., 20.],[10., 40., 50., 20.]])}

Ответы [ 3 ]

2 голосов
/ 06 апреля 2020

Вы получаете эту ошибку, потому что ваш аргумент key= должен получить доступ к значению цифры 1009 *. В вашем случае вы извлекаете матрицу. Поэтому, когда sorted() пытается отсортировать ваш массив, он пытается сравнить 2 numpy матрицы - ваши ключи. Он не работает с numpy, потому что numpy генерирует матрицу логического типа при сравнении матриц, а не одно числовое значение c. Так что python не знает, как с этим справиться.

В вашем случае вам нужно подумать о том, какие именно критерии вы хотите использовать. Это первое значение в первом ряду? Это сумма значений в первом ряду? Общая сумма матрицы?

Вот несколько примеров, которые могут вам помочь:

# Sort by the matrix total sum
d2 = {k: v for k, v in sorted(original_dict.items(), key=lambda item: item[1].sum())}

# Sort by the first row sum
d2 = {k: v for k, v in sorted(original_dict.items(), key=lambda item: item[1][0].sum())}

# Sort by the first element of the first row
d2 = {k: v for k, v in sorted(original_dict.items(), key=lambda item: item[1][0, 0])}
2 голосов
/ 06 апреля 2020

Вы были почти там со своей строкой кода.

Что вы делаете в лямбда-функции - это извлечение элемента [1]. Это первая запись кортежа (ключ, значение), в этом случае вы извлекаете только свой массив. Теперь вы не можете сортировать весь массив, поэтому вы можете сделать что-то вроде этого:

d2 = {k: v for k, v in sorted(original_dict.items(), key=lambda item: item[1].flatten()[0])}

Здесь вы сглаживаете свой массив с помощью метода np.array.flatten и используете первую запись для сортировки.

0 голосов
/ 06 апреля 2020

Что вам нужно было сделать, это преобразовать возвращаемое значение метода dictionary.items () в список. Возвращаемое значение недопустимо, так что, вероятно, именно здесь произошла ошибка

original_dict = {'file1.txt': array([[ 9., 40., 50., 20.],[10., 40., 50., 20.]]), 
                 'file2.txt':array([[1., 2., 3., 4.],[2., 2., 3., 4.]]), 
                 'file3.txt': array([[0.1, 0.2, 0.3, 0.4],[0.2, 0.2, 0.3, 0.4]])}


d2 = {k: v for k, v in sorted(list(original_dict.items()), key=lambda item: item[1])}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...