2012-03-17 4 views
1

나는이 형식 목록의 목록을 가지고 :파이썬은

[[<image object1>, source1 , version1],[<image object2>, source2 , version2]...]

내가 각 목록을 비교하고 독특한 소스 값이 포함 된 목록의 새 목록을 구성해야합니다. 복제 된 소스 값이있을 때 가장 높은 버전 값을 가진 목록을 선택해야합니다.

또한 적절한 데이터 구조를 사용해야합니까? 당신은 itertools.groupby을 사용할 수 있습니다

답변

4

그에 대한 max 기능 :

>>> lst = [['foo', 1, 2], ['asdf', 2, 5], ['bar', 1, 3]] 
>>> import itertools as it 
>>> from operator import itemgetter 
>>> [max(items, key=itemgetter(2)) 
    for _,items in it.groupby(sorted(lst, key=itemgetter(1)), key=itemgetter(1))] 
[['bar', 1, 3], ['asdf', 2, 5]] 
0

귀하의 하위 목록이 모두 같은 세 가지 항목의 구조를 가지고 있다고 가정은, 이후 당신은 항상 할 수있는, 사용하기 매우 합리적인 데이터 구조처럼 보인다 색인 [0], [1] 및 [2]로 이미지 객체, 소스 및 버전에 액세스합니다.

이 코드는 소스를 사전의 키가되게하고 하위 목록은 해당 키의 값을 만듭니다.

bigList = [['foo', 1, 2], ['asdf', 2, 5], ['bar', 1, 3]] 
uniqueSources = {} 
for sublist in bigList: 
    currentSource = sublist[1] 
    if currentSource in uniqueSources: 
     if sublist[2] > uniqueSources[currentSource][2]: 
      uniqueSources[currentSource] = sublist 
    else: uniqueSources[currentSource] = sublist 
dupesRemoved = list(uniqueSources.values()) 
print(dupesRemoved)