Сортировать список словаря в Python на основе значений и добавить отсортированные объекты в новый список - PullRequest
0 голосов
/ 14 мая 2018

У меня есть список словарей. В каждом словаре есть два ключевых значения, которые следует учитывать при сортировке. Один - "col" , а другой - "строка"

Что я хочу

Для каждой "строки" ключа я хочу получить все объекты и отсортировать их по значению "col" . И в окончательном списке должны быть все объекты "строка" мудрый и отсортированный по "столб"

Например

Для «строки» ключ со значением 1 Я хочу получить все объекты и отсортировать эти объекты в порядке возрастания значения ключа «col».

Примечание: значение col варьируется только от 1 до 12

Что я пробовал

Это своего рода псевдокод того, что я пробовал

for column_number in range(1,13):
    for each object in json:
        if object's "row" key is equal to column number(For each coloumn get all of its object):
            add_the_objects_of_each_column_to_a_list
        sort_the_list
        add_the_sorted_list_to_a_new_list(this list should be similar in form as the input)

Мой фактический код

list_to_sort = []
newlist = []
sorted_list = []


for col_number in range(1,13):
    for obj in mson:    
        if(obj['row'] == col_number):
            list_to_sort.append(obj)
        newlist = sorted(list_to_sort, key=lambda k: k['col'])

#I am not able to write below this for how I will place this sorted newlist in my 

final sorted_list variable which is the final variable I want having row wise objects which are sorted on column

Переменная, которая должна быть отсортирована:

mson = [
    {'col': 10, 'row': 1, 'size_x': 3, 'size_y': 3},
    {'col': 1, 'row': 1, 'size_x': 3, 'size_y': 2},
    {'col': 5, 'row': 1, 'size_x': 2, 'size_y': 2},
    {'col': 1, 'row': 3, 'size_x': 3, 'size_y': 2},
    {'col': 1, 'row': 5, 'size_x': 2, 'size_y': 2},
    {'col': 1, 'row': 7, 'size_x': 3, 'size_y': 2},
    {'col': 8, 'row': 4, 'size_x': 3, 'size_y': 3.0},
    {'col': 6, 'row': 7, 'size_x': 3, 'size_y': 2}]

** Мой желаемый выход для вышеуказанной переменной mson **

mson_sorted = [
    {'col': 1, 'row': 1, 'size_x': 3, 'size_y': 2},
    {'col': 5, 'row': 1, 'size_x': 2, 'size_y': 2},
    {'col': 10, 'row': 1, 'size_x': 3, 'size_y': 3},
    {'col': 1, 'row': 3, 'size_x': 3, 'size_y': 2},
    {'col': 8, 'row': 4, 'size_x': 3, 'size_y': 3.0},
    {'col': 1, 'row': 5, 'size_x': 2, 'size_y': 2},
    {'col': 1, 'row': 7, 'size_x': 3, 'size_y': 2},
    {'col': 6, 'row': 7, 'size_x': 3, 'size_y': 2}]

Любая помощь будет по достоинству оценена

1 Ответ

0 голосов
/ 14 мая 2018

sorted

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

sorted(mson, key=lambda d: (d['row'], d['col']))

[{'col': 1, 'row': 1, 'size_x': 3, 'size_y': 2},
 {'col': 5, 'row': 1, 'size_x': 2, 'size_y': 2},
 {'col': 10, 'row': 1, 'size_x': 3, 'size_y': 3},
 {'col': 1, 'row': 3, 'size_x': 3, 'size_y': 2},
 {'col': 8, 'row': 4, 'size_x': 3, 'size_y': 3.0},
 {'col': 1, 'row': 5, 'size_x': 2, 'size_y': 2},
 {'col': 1, 'row': 7, 'size_x': 3, 'size_y': 2},
 {'col': 6, 'row': 7, 'size_x': 3, 'size_y': 2}]

Тот же ответ, более явный

def f(d):
    return d['row'], d['col']

sorted(mson, key=f)

Панды

pd.DataFrame(mson, dtype=object).sort_values(['row', 'col']).to_dict('r')

[{'col': 1, 'row': 1, 'size_x': 3, 'size_y': 2},
 {'col': 5, 'row': 1, 'size_x': 2, 'size_y': 2},
 {'col': 10, 'row': 1, 'size_x': 3, 'size_y': 3},
 {'col': 1, 'row': 3, 'size_x': 3, 'size_y': 2},
 {'col': 8, 'row': 4, 'size_x': 3, 'size_y': 3.0},
 {'col': 1, 'row': 5, 'size_x': 2, 'size_y': 2},
 {'col': 1, 'row': 7, 'size_x': 3, 'size_y': 2},
 {'col': 6, 'row': 7, 'size_x': 3, 'size_y': 2}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...