2017-11-20 15 views
1

다음과 관련하여 어려움을 겪고 있습니다. 나는 간단한 비교와 함께 할 시도 요소 (2)와 (3)목록의 다음 요소에 따라 첫 번째 요소의 범위를 가져 오는 중

uniqdo = [ (['A1'],['A2']), (['B1'],['B2']),([],['A2']) ] 
dorange = [ "1280-1276,1272","1274","1270" ] 

으로 분류 소트

dolist = [(1280, ['A1'], ['A2']), (1278, ['A1'], ['A2']), (1276, ['A1'], ['A2']), (1274, ['B1'], ['B2']), (1272, ['A1'], ['A2']), (1270, [], ['A2'])] 

가 지금은 목록을 갖고 싶어하지만 코드는 여러 가지로 매우 긴됩니다 : 기본적으로 나는 목록을 가지고 테스트하고 좀 지저분 해 보입니다. 이 작업을 합리적인 속도로 수행 할 수있는 라이브러리 함수가 있어야합니다.

+1

, 왜'1280-1272'로 범위를 지정하지? 게다가 정렬을하면'1272-1280'으로 지정하는 것이 합리적입니다. – RomanPerekhrest

+0

@RomanPerekhrest : 아마도 1274가'1280-1272' 안에 있지만 값이 같지 않기 때문일 수 있습니다. –

+0

그리고'(1274, [ 'B1'], [ 'B2'])'대신'(1279, [ 'B1'], [ 'B2'])'가 있으면 범위를 어떻게보아야합니까? – RomanPerekhrest

답변

1

그것은 itertools.groupby는 도움이되는 다음과 같습니다

>>> dolist = [ (1280,['A1'],['A2']),(1278,['A1'],['A2']),(1276,['A1'],['A2']),(1274,['B1'],['B2']),(1272,['A1'],['A2']) ] 
>>> from itertools import groupby 
>>> [[v, [i for i,*_ in g]] for v, g in groupby(dolist, key= lambda l: (l[1][0], l[2][0]))] 
[[('A1', 'A2'), [1280, 1278, 1276]], [('B1', 'B2'), [1274]], [('A1', 'A2'), [1272]]] 

당신이 원하는 일에 위의 데이터 구조를 변환하는 데 어렵지 않을 것이다.

여기가 시작되었습니다. 파이썬 목록을 dict 키로 사용할 수 없기 때문에 목록을 입력으로 남겨 둘 수 없습니다. 그래서 get_value 반환하는 대신 빈리스트의 None : 1278`가 흡수`경우

from itertools import groupby 

dolist = [(1280, ['A1'], ['A2']), (1278, ['A1'], ['A2']), (1276, ['A1'], ['A2']), (1274, ['B1'], ['B2']), (1272, ['A1'], ['A2']), (1270, [], ['A2'])] 
ranges = {} 


def get_value(l): 
    if l: 
     return l[0] 
    else: 
     return None 


def get_values(t): 
    return (get_value(t[1]), get_value(t[2])) 

for v, g in groupby(dolist, get_values): 
    ids = [str(t[0]) for t in g] 
    if len(ids) > 1: 
     range_str = ids[0] + '-' + ids[-1] 
    else: 
     range_str = ids[0] 
    ranges.setdefault(v, []).append(range_str) 

print(ranges) 
# {('A1', 'A2'): ['1280-1276', '1272'], ('B1', 'B2'): ['1274'], (None, 'A2'): ['1270']} 
+0

감사합니다. 나는 열쇠를 가지고 일하는 것을 두려워하지 않았다. 그것은 위대한 예제에서 작동합니다. 그러나 아아, 나는이 예에서 튜플에 빈리스트가있을 수 있다는 것을 포함해야했다. 어떻게 든이 일은 루프가 잘못되게합니다. – Cnoobplusplus

+0

@Cnoobplusplus : 업데이트를 참조하십시오. –