2016-06-16 2 views
3

1_2과 같이 parent.id_child.id 형식의 항목 목록이 나타납니다. 부모 아이디로 아이의 아이디를 그룹화하려고 시도했습니다. 예를 들어, 입력에서 ['1_2', '2_2', '1_1', '2_1', '1_3'] 출력이 [['1','2','3'], ['1','2']]이 필요합니다. 나는이 시도 : 나는 각 항목의 두 번째 요소를 얻기 위해 필요에 의해 제대로itertools groupby를 사용하여 목록을 작성하십시오

inputlist = ['1_2', '1_1', '2_1', '1_3', '2_2' ] 
outputlist= [item.split('_') for item in inputlist] 
outputlist.sort() 
final = [list(group) for key, group in itertools.groupby(outputlist, lambda x: x[0])] 

이 그룹 요소를. 이것을 어떻게 할 수 있습니까? 또한 전체 목록을 단일 목록 이해 문장으로 처리 할 수 ​​있습니까?

답변

2

목록의 이해력을 사용하십시오. 예; ,

final = [[g[1] for g in group] for key, group in itertools.groupby(outputlist, lambda x: x[0])] 

당신은 groupby 호출에 분할을 중첩하여 하나의 표현에 모든 일을 할 수 있지만이 빠른 오히려 추한됩니다 : 당신이 다시 선택해야하므로 값 자체는 각 그룹 반복자로 변경 전달 심지어 여러 줄에 걸쳐 분할 때

final = [ 
    [g[1] for g in group] 
    for key, group in itertools.groupby(
     sorted(item.split('_') for item in inputlist), 
     lambda x: x[0])] 

당신은 전체 입력 목록을 정렬 피하기 만 그룹화 할 수있는 사전을 사용하여 작은 그룹을 정렬 할 수 있습니다. 파이썬 2에서

per_parent = {} 
for item in inputlist: 
    parent, child = item.split('_', 1) 
    per_parent.setdefault(parent, []).append(child) 
final = [children for parent, children in sorted(
    per_parent.items(), key=lambda pc: int(pc[0]))] 

중간 구축을 방지하기 위해 iteritems()보다는 items()를 사용하여 ID의 크기에 Dependending, 당신은 당신의 IDS 수치뿐만 아니라 (텍스트 정렬하기 때문에 전적으로 이루어집니다를) 정렬 할 수 있습니다 명부.

+0

우수 답변! 감사 – Yasel

관련 문제