2016-09-19 5 views
3

정렬 할 항목 목록이 있다고 가정 해 봅시다 : items = [ item1, item2, item3 ]. 내가 그들을 정렬하는 데 사용하려는 속성은 item.data.value, 그래서 일반적으로 갈 것 :속성별로 정렬 할 수있는 파이썬 정렬 없음

sorted(items, key=attrgetter('data.value')) 

그리고 그것은 잘 작동 것입니다. 그러나 data은 실제로 None 일 수 있으므로 분명히 value에 액세스 할 수 없습니다.

대개 어떻게 이런 시나리오를 처리합니까?

추 신 : this question도 아니고 this one도 아닙니다. 당신은 그럼 그냥 직접 작성하고자하는 키를 반환 편리한 기능이없는 경우

+0

어떻게 값을 정렬 하시겠습니까? – RemcoGerlich

+0

높은 우선 순위 또는 낮은 우선 순위 중 하나는 별 상관이 없습니다. 목록의 꼬리 부분에 그것들을 넣으면 더 이해할 수있을 것입니다. – dabadaba

+0

Nones를이 답안과 같은 센티널 값으로 대체 할 수 있습니다. http://stackoverflow.com/a/26348624/393010 – Moberg

답변

1
sorted(items, key=lambda i: i.data.value if i.data else 0) 
+0

예. 방금 시도한 내용입니다. '0' 대신에'None'을 사용했지만 두 비교 모두 같은 것으로 평가할 것이라고 생각합니다. – dabadaba

0

sorted(filter(None, items), key=attrgetter('data.value')) 
+0

같은 핀치;) 현명한 생각 : D – thiruvenkadam

+0

항목을 필터링하고 싶지 않습니다. – dabadaba

+0

@thiruvenkadam;) – armak

0

정렬하기 전에 없음 필터링.

def item_key(item): 
    try: 
     return item.data.value 
    except AttributeError: 
     return None 

sorted(items, key=item_key) 
+0

나는 이것을 lambda 할 수 있을까? 나는 실제로 이것을 시도했다 :'sorted (items, key = lambda x : x.data.value if x.data else None)'이것은 당신의 답과 유사 할까? – dabadaba

+0

@dabadaba 그것은 동일하지 않지만 사양을 만족시킬 것입니다 ('item' 자체가'None'이거나'item.data'가'None'이 아니고'value' 속성이 없다면 어떤 일이 발생 할지를 지정하지 않았습니다 또는 얼마나 자주'item.data.value'가 존재하지 않아서 임의의 가정을했는지). 이 경우 어쨌든 명명 된 함수를 사용합니다. – Goyo

0

정렬을 위해 보내기 전에 값을 먼저 필터링하십시오.

sorted(filter(None, items), key=attrgetter('data.value')) 

그리고 당신은 정말 너무 없음 항목을하려는 경우, 당신은 같은 것을 수행 할 수 있습니다

# items already defined with values 
new_items_list = sorted(filter(None, items), key=attrgetter('data.value')) 
new_items_list.extend([None] * (len(items) - len(new_items_list))) 

그러나, 나는 당신이 정말로 없음 항목을해야하는지 잘 모르겠습니다을.

편집 : 없음 항목을 유지할 종료 코드가 수정되었습니다. (False, value) 같은 키 튜플, 같은

+0

'None'항목이 필요합니다. – dabadaba

+0

최신 편집은 없음 항목도 제공합니다. – thiruvenkadam

2

사용. 값이 None이면 튜플은 (True, None)이어야합니다.

튜플은 먼저 첫 번째 요소에 의해 비교 된 다음 두 번째 요소와 비교됩니다. True 이전에 False가 정렬됩니다. 따라서 None 값은 모두 끝에 정렬됩니다.

def none_to_end_key(item): 
    value = item.data.value if item.data else None 
    return (value is None, value) 

sorted(items, key=none_to_end_key) 

모든 없음 값을 끝으로 정렬합니다.

이제 Python-2.7 질문에 태그가 추가 된 것을 볼 수 있습니다. 그러면 이것은 아마도 과장 될 것입니다. 파이썬 3에서 None을 정수 또는 문자열과 비교하면 예외가 발생하므로 None과 다른 값으로리스트를 정렬 할 수 없으며 이와 같은 것이 필요합니다.

+0

이것은 3 호환 가능할뿐만 아니라 현재 허용되는 답변과 달리 item.data.value에 음수 값과 양수 값이 모두있는 경우에도 Nones를 끝에 놓습니다. 정말로 원한다면 한 줄짜리로 만들 수도 있습니다. (필자는 그렇게 생각하지 않지만 어떤 사람들은 어떤 이유로 킬러 기능을 고려하는 것 같습니다.) – DSM

관련 문제