문자열 길이를 기준으로 Python 목록 정렬


110

문자열 길이를 기준으로 문자열 목록을 정렬하고 싶습니다. 나는 다음과 같이 정렬을 사용하려고 시도했지만 올바른 결과를 얻지 못하는 것 같습니다.

xs = ['dddd','a','bb','ccc']
print xs
xs.sort(lambda x,y: len(x) < len(y))
print xs

['dddd', 'a', 'bb', 'ccc']
['dddd', 'a', 'bb', 'ccc']

무엇이 잘못 되었을까요?

답변:


201

당신이 통과하는 경우 lambdasort, 당신은 정수가 아닌 부울을 반환해야합니다. 따라서 코드는 다음과 같이 읽어야합니다.

xs.sort(lambda x,y: cmp(len(x), len(y)))

참고 CMP가 내장 명령 함수가되도록 cmp(x, y)복귀 경우 -1 x미만 y0이 경우, xIS가 동일한 y경우, 1 x보다 크다 y.

물론 대신 key매개 변수 를 사용할 수 있습니다 .

xs.sort(key=lambda s: len(s))

이것은 sort키 함수가 반환하는 모든 것에 따라 순서를 지정 하도록 메서드에 지시합니다.

편집 : 아래의 balpha와 Ruslan에게 감사드립니다 len. 키 매개 변수로 함수에 직접 전달할 수 있으므로 a가 필요하지 않습니다 lambda.

xs.sort(key=len)

그리고 Ruslan이 아래에서 지적했듯이 기존의 목록을 제자리에서 정렬하는 대신 새 목록을 만드는 메서드 대신 내장 정렬 된 함수 를 사용할 수도 있습니다 list.sort.

print(sorted(xs, key=len))

32
에 대한 필요가 없습니다 lambda. 그냥 사용key = len
balpha

15
이것은 오름차순 (위에 작은 단어 길이), 내림차순 (아래에 작은 단어 길이)으로 정렬합니다. 매개 변수를 추가합니다. reverse = True
Ajay Gupta

xs.sort()"()에는 위치 인수를 취하지 않는 일종의 형식 오류"를 던졌습니다. 대신해야합니다xs.sort(key=lambda x: len(x))
Hi-Angel

84

Eli의 답변과 동일 lambda합니다. 여기서 부분을 건너 뛸 수 있으므로 더 짧은 형식을 사용 하십시오.

새 목록 생성 :

>>> xs = ['dddd','a','bb','ccc']
>>> sorted(xs, key=len)
['a', 'bb', 'ccc', 'dddd']

내부 정렬 :

>>> xs.sort(key=len)
>>> xs
['a', 'bb', 'ccc', 'dddd']

5
길이에 대한 역 정렬은 어떻게합니까?
user2922935

1
@ user2922935 : xs [::-1]을 수행하여 이미 정렬 된 목록을 반대로 할 수 있습니다. Dan Bader의 기사를 여기에서 확인하십시오. dbader.org/blog/python-reverse-list
Thyag

7
xs.sort(key=len, reverse=True)
Raz

5

정렬하는 동안 파이썬 키 기능이 작동하는 방식을 추가하고 싶습니다.

장식-정렬-장식 해제 디자인 패턴 :

정렬시 주요 기능에 대한 Python의 지원은 decorate-sort-undecorate 디자인 패턴으로 알려진 것을 사용하여 구현됩니다.

3 단계로 진행됩니다.

  1. 목록의 각 요소는 요소에 적용된 키 기능의 결과를 포함하는 "장식 된"버전으로 일시적으로 대체됩니다.

  2. 목록은 키의 자연스러운 순서에 따라 정렬됩니다.

  3. 장식 된 요소는 원래 요소로 대체됩니다.

비교하기 전에 각 목록 요소에서 호출 할 함수를 지정하는 키 매개 변수입니다. 문서


4

이를 수행하는 가장 쉬운 방법은 다음과 같습니다.

list.sort (key = 람다 x : len (x))


1

길이를 기준으로 문자열 목록을 정렬하는 함수 lensort를 작성하십시오.

def lensort(a):
    n = len(a)
    for i in range(n):
        for j in range(i+1,n):
            if len(a[i]) > len(a[j]):
                temp = a[i]
                a[i] = a[j]
                a[j] = temp
    return a
print lensort(["hello","bye","good"])

0
def lensort(list_1):
    list_2=[];list_3=[]
for i in list_1:
    list_2.append([i,len(i)])
list_2.sort(key = lambda x : x[1])
for i in list_2:
    list_3.append(i[0])
return list_3

이것은 나를 위해 작동합니다!


0

기능을 사용하여 아래 두 가지 방법을 사용하여 할 수 있습니다.

def lensort(x):
    list1 = []
    for i in x:
        list1.append([len(i),i])
    return sorted(list1)

lista = ['a', 'bb', 'ccc', 'dddd']
a=lensort(lista)
print([l[1] for l in a])

Lambda를 사용하는 한 라이너에서 아래와 같이 이미 위에 답변했습니다.

 lista = ['a', 'bb', 'ccc', 'dddd']
 lista.sort(key = lambda x:len(x))
 print(lista)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.