문제

사전 목록이 있고 각 항목을 특정 속성 값으로 정렬하고 싶습니다.

아래 배열을 고려하십시오.

[{'name':'Homer', 'age':39}, {'name':'Bart', 'age':10}]

기준으로 정렬하면 name, 되어야 한다

[{'name':'Bart', 'age':10}, {'name':'Homer', 'age':39}]
도움이 되었습니까?

해결책

cmp 대신 키를 사용하면 더 깔끔하게 보일 수 있습니다.

newlist = sorted(list_to_be_sorted, key=lambda k: k['name']) 

또는 J.F.Sebastian과 다른 사람들이 제안한 것처럼

from operator import itemgetter
newlist = sorted(list_to_be_sorted, key=itemgetter('name')) 

완전성을 위해 (fitzgeraldsteele의 의견에서 지적한대로) 다음을 추가하십시오. reverse=True 내림차순 정렬

newlist = sorted(l, key=itemgetter('name'), reverse=True)

다른 팁

import operator

key='name'으로 사전 목록을 정렬하려면:

list_of_dicts.sort(key=operator.itemgetter('name'))

key='age'를 기준으로 사전 목록을 정렬하려면 다음을 수행하세요.

list_of_dicts.sort(key=operator.itemgetter('age'))

여러 키로 목록을 정렬하려면 다음을 수행할 수 있습니다.

my_list = [{'name':'Homer', 'age':39}, {'name':'Milhouse', 'age':10}, {'name':'Bart', 'age':10} ]
sortedlist = sorted(my_list , key=lambda elem: "%02d %s" % (elem['age'], elem['name']))

비교를 위해 값을 단일 문자열 표현으로 변환하기 때문에 다소 해킹적이지만 음수를 포함한 숫자에 대해 예상대로 작동합니다(숫자를 사용하는 경우 0 패딩으로 문자열 형식을 적절하게 지정해야 하지만).

my_list = [{'name':'Homer', 'age':39}, {'name':'Bart', 'age':10}]

my_list.sort(lambda x,y : cmp(x['name'], y['name']))

my_list 이제 당신이 원하는 것이 될 것입니다.

(3년 후) 다음을 추가하도록 편집되었습니다.

새로운 key 논쟁이 더 효율적이고 깔끔합니다.이제 더 나은 대답은 다음과 같습니다.

my_list = sorted(my_list, key=lambda k: k['name'])

...IMO에서는 람다가 다음보다 이해하기 쉽습니다. operator.itemgetter, 하지만 YMMV.

import operator
a_list_of_dicts.sort(key=operator.itemgetter('name'))

'key'는 임의의 값으로 정렬하는 데 사용되며 'itemgetter'는 해당 값을 각 항목의 'name' 속성으로 설정합니다.

a = [{'name':'Homer', 'age':39}, ...]

# This changes the list a
a.sort(key=lambda k : k['name'])

# This returns a new list (a is not modified)
sorted(a, key=lambda k : k['name']) 

나는 당신이 의미한 것 같아요:

[{'name':'Homer', 'age':39}, {'name':'Bart', 'age':10}]

이는 다음과 같이 정렬됩니다.

sorted(l,cmp=lambda x,y: cmp(x['name'],y['name']))

Perl의 Schwartzian 변환을 사용하여,

py = [{'name':'Homer', 'age':39}, {'name':'Bart', 'age':10}]

하다

sort_on = "name"
decorated = [(dict_[sort_on], dict_) for dict_ in py]
decorated.sort()
result = [dict_ for (key, dict_) in decorated]

준다

>>> result
[{'age': 10, 'name': 'Bart'}, {'age': 39, 'name': 'Homer'}]

자세한 내용 Perl Schwartzian 변환

컴퓨터 과학에서 Schwartzian Transform은 항목 목록을 정렬하는 효율성을 향상시키는 데 사용되는 Perl 프로그래밍 관용구입니다.이 관용구는 주문이 실제로 요소의 특정 속성 (키)을 기반으로하는 경우 비교 기반 분류에 적합합니다. 여기서 해당 속성을 컴퓨팅하는 것은 최소한의 횟수로 수행 해야하는 집중적 인 작업입니다.슈워츠 Transform은 명명된 임시 배열을 사용하지 않는다는 점에서 주목할 만합니다.

사용자 정의 비교 함수를 사용하거나 사용자 정의 정렬 키를 계산하는 함수를 전달할 수 있습니다.키는 항목당 한 번만 계산되는 반면 비교 함수는 더 많이 호출되므로 일반적으로 더 효율적입니다.

다음과 같은 방법으로 할 수 있습니다:

def mykey(adict): return adict['name']
x = [{'name': 'Homer', 'age': 39}, {'name': 'Bart', 'age':10}]
sorted(x, key=mykey)

그러나 표준 라이브러리에는 임의 개체의 항목을 가져오는 일반 루틴이 포함되어 있습니다. itemgetter.대신 다음을 시도해 보세요.

from operator import itemgetter
x = [{'name': 'Homer', 'age': 39}, {'name': 'Bart', 'age':10}]
sorted(x, key=itemgetter('name'))

이름 키 값으로 사전을 비교하는 자체 비교 함수를 구현해야 합니다.보다 PythonInfo Wiki에서 미니 HOW TO 정렬

대체 일반 솔루션은 다음과 같습니다. 키와 값을 기준으로 dict의 요소를 정렬합니다.장점은 키를 지정할 필요가 없으며 일부 사전에 일부 키가 누락된 경우에도 여전히 작동한다는 것입니다.

def sort_key_func(item):
    """ helper function used to sort list of dicts

    :param item: dict
    :return: sorted list of tuples (k, v)
    """
    pairs = []
    for k, v in item.items():
        pairs.append((k, v))
    return sorted(pairs)
sorted(A, key=sort_key_func)

언젠가는 우리가 사용해야 할 때 lower() 예를 들어

lists = [{'name':'Homer', 'age':39},
  {'name':'Bart', 'age':10},
  {'name':'abby', 'age':9}]

lists = sorted(lists, key=lambda k: k['name'])
print(lists)
# [{'name':'Bart', 'age':10}, {'name':'Homer', 'age':39}, {'name':'abby', 'age':9}]

lists = sorted(lists, key=lambda k: k['name'].lower())
print(lists)
# [ {'name':'abby', 'age':9}, {'name':'Bart', 'age':10}, {'name':'Homer', 'age':39}]

나는 다음과 같은 것을 시도했습니다 :

my_list.sort(key=lambda x: x['name'])

정수에서도 작동했습니다.

pandas 패키지를 사용하는 것도 또 다른 방법이지만 대규모 런타임은 다른 사람들이 제안한 전통적인 방법보다 훨씬 느립니다.

import pandas as pd

listOfDicts = [{'name':'Homer', 'age':39}, {'name':'Bart', 'age':10}]
df = pd.DataFrame(listOfDicts)
df = df.sort_values('name')
sorted_listOfDicts = df.T.to_dict().values()

다음은 작은 목록과 큰(100,000+) 사전 목록에 대한 몇 가지 벤치마크 값입니다.

setup_large = "listOfDicts = [];\
[listOfDicts.extend(({'name':'Homer', 'age':39}, {'name':'Bart', 'age':10})) for _ in range(50000)];\
from operator import itemgetter;import pandas as pd;\
df = pd.DataFrame(listOfDicts);"

setup_small = "listOfDicts = [];\
listOfDicts.extend(({'name':'Homer', 'age':39}, {'name':'Bart', 'age':10}));\
from operator import itemgetter;import pandas as pd;\
df = pd.DataFrame(listOfDicts);"

method1 = "newlist = sorted(listOfDicts, key=lambda k: k['name'])"
method2 = "newlist = sorted(listOfDicts, key=itemgetter('name')) "
method3 = "df = df.sort_values('name');\
sorted_listOfDicts = df.T.to_dict().values()"

import timeit
t = timeit.Timer(method1, setup_small)
print('Small Method LC: ' + str(t.timeit(100)))
t = timeit.Timer(method2, setup_small)
print('Small Method LC2: ' + str(t.timeit(100)))
t = timeit.Timer(method3, setup_small)
print('Small Method Pandas: ' + str(t.timeit(100)))

t = timeit.Timer(method1, setup_large)
print('Large Method LC: ' + str(t.timeit(100)))
t = timeit.Timer(method2, setup_large)
print('Large Method LC2: ' + str(t.timeit(100)))
t = timeit.Timer(method3, setup_large)
print('Large Method Pandas: ' + str(t.timeit(1)))

#Small Method LC: 0.000163078308105
#Small Method LC2: 0.000134944915771
#Small Method Pandas: 0.0712950229645
#Large Method LC: 0.0321750640869
#Large Method LC2: 0.0206089019775
#Large Method Pandas: 5.81405615807

아래 요소가 포함된 사전 D가 있다고 가정해 보겠습니다.정렬하려면 정렬된 키 인수를 사용하여 아래와 같이 사용자 정의 함수를 전달합니다.

D = {'eggs': 3, 'ham': 1, 'spam': 2}

def get_count(tuple):
    return tuple[1]

sorted(D.items(), key = get_count, reverse=True)
or
sorted(D.items(), key = lambda x: x[1], reverse=True)  avoiding get_count function call

https://wiki.python.org/moin/HowTo/Sorting/#Key_Functions

여기는 여러 열을 기준으로 정렬하는 관련 질문에 대한 내 대답.또한 열 수가 하나만 있는 퇴화된 경우에도 작동합니다.

원본이 필요하지 않은 경우 list ~의 dictionaries, 다음을 사용하여 내부에서 수정할 수 있습니다. sort() 사용자 정의 키 기능을 사용하는 방법.

주요 기능:

def get_name(d):
    """ Return the value of a key in a dictionary. """

    return d["name"]

그만큼 list 정렬할 항목:

data_one = [{'name': 'Homer', 'age': 39}, {'name': 'Bart', 'age': 10}]

그 자리에서 정렬 :

data_one.sort(key=get_name)

원본이 필요하신 경우 list, 를 불러 sorted() 그것을 전달하는 함수 list 및 키 기능을 지정한 다음 반환된 정렬을 할당합니다. list 새 변수에:

data_two = [{'name': 'Homer', 'age': 39}, {'name': 'Bart', 'age': 10}]
new_data = sorted(data_two, key=get_name)

인쇄 data_one 그리고 new_data.

>>> print(data_one)
[{'name': 'Bart', 'age': 10}, {'name': 'Homer', 'age': 39}]
>>> print(new_data)
[{'name': 'Bart', 'age': 10}, {'name': 'Homer', 'age': 39}]

당신이 사용할 수있는 아이템 획득자 ,성능을 고려하고 싶다면. 아이템 획득자 일반적으로 다음보다 조금 더 빠르게 실행됩니다. 람다.

from operator import itemgetter
result = sorted(data, key=itemgetter('age'))  # this will sort list by property order 'age'.

다음 코드를 사용할 수 있습니다

sorted_dct = sorted(dct_name.items(), key = lambda x : x[1])
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top