2012-09-26 2 views
0

Python에 처음 접했고 목록 및 정렬 멤버를 사용하여 놀았습니다.키 다중 매개 변수를 사용하여 L.sort를 사용하여 문자열 목록 정렬

li=["hgjtud", "iernfd", "scoeps", "stiiss", "stripe"] 

지금은 나는 다음과 같은 기능을 정의하는 몇 순위에 따라 그 목록을 정렬하려면 :

def rank_string(str1,str2): 
    rank=0 
    for i in range(len(str1)): #all strings will be checked to be equal length 
     if (str1[i]==str2[i]): 
      rank += 1 
    return rank 
나는 무작위 문자열 목록 (동일한 길이의 모든 문자열을)이있는 경우 내 질문은

지금은 목표 문자열과 함께이 기능을 사용하여 내 목록을 정렬하려면, 그래서 나는 다음과 같은 시도 :

target_string="stripe" 
df = lambda x:rank_string(x,target_string) 
sorted_list = resultlist.sort(key=df) 

내가 모든 목록 값은 키 후 부여됩니다 인상이었다 순위 함수의 한 번 통과 한 다음 이것에 따라 정렬 할 수 있습니까? 이것은 실행되지만 sorted_list에는 None 값이 있습니다. 나는 그것이 n00b 인 것으로 가정하고, 나는 근본적인 무언가를 놓치고있다. 뭐? :-)

미리 도움을 주셔서 감사합니다.

답변

1

.sort() 메서드 을 내부에서으로 정렬하고 아무 것도 반환하지 않습니다.

정렬 된 목록을 반환하고 원래 입력 목록을 변경하지 않으려면 sorted()을 대신 사용하십시오.

>>> a = [2, 3, 1] 
>>> a.sort() 
>>> a 
[1, 2, 3] 
>>> b = [2, 3, 1] 
>>> sorted(b) 
[1, 2, 3] 
>>> b 
[2, 3, 1] 
+0

네! 내가 예상했던대로 작동합니다. 감사. – Englishbob

0

resultlist.sort는 목록의 방법이다 장소에 resultlist을 정렬하고 None를 반환합니다.

sorted_list = sorted(li, key=df) 트릭을해야합니다.

1

다른 말로, sorted()은 새 목록을 반환합니다. 코드는 다음과 같을 수 있습니다 :

li = ["hgjtud", "iernfd", "scoeps", "stiiss", "stripe"] 
target_string = "stripe" 

sorted_list = sorted(li, key=lambda x: sum(1 for c1,c2 in zip(x, target_string) if c1==c2)) 

반환 다른 사람처럼 ['hgjtud', 'iernfd', 'scoeps', 'stiiss', 'stripe']

+0

나는 간결함이 매우 희미하다는 것을 깨닫기 시작했습니다 :-) 그리고가는 길입니다. 감사. – Englishbob

1

sorted()을 사용했다. 또한 당신은 일을 짧게 만들 수 :

from functools import partial 

def rank_string(str1, str2): 
    return sum(a == b for a, b in zip(str1, str2)) 

li = ["hgjtud", "iernfd", "scoeps", "stiiss", "stripe"] 
sorted_list = sorted(li, key=partial(rank_string, "stripe")) 

[편집]

from operator import eq 

def rank_string(str1, str2): 
    return sum(map(eq, str1, str2)) 

:-)

[/ 편집]

+0

다시, 나는 친숙 함으로 친숙 함을 느낍니다 .-) – Englishbob

+0

@Englishbob : 간결함에 관해서는 제 편집을 참조하십시오. – pillmuncher

관련 문제