基于值对python中的字典列表进行排序,并将排序后的对象添加到新列表中

时间:2018-05-14 18:51:59

标签: python pandas sorting numpy

我有一个字典列表。每个字典有两个关键值,在排序时要考虑。一个是“col”,另一个是“row” < / p>

我想要什么

对于每个“row”键,我想获取所有对象并按“col”的值对它们进行排序。最终列表应包含所有对象“行”明智且排序在“col”

例如

对于值为1的“row”键,我想获取所有对象,并按键“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 :(得分:2)

sorted

使用key中的sorted参数。确保传递一个callable,它返回要按顺序优先级排序的元素中的元组。

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}]