2016-07-09 1 views
1

나는이목록의 길이를 우선 순위로하면서 첫 번째 요소를 기반으로 중첩 목록에서 중복을 제거하는 방법은 무엇입니까?

[[7, 6, 8], [1, 10], [3, 10], [7, 8], [7, 4], [9, 4], [5, 8], [9, 8]] 

같은 목록을 가지고 그리고 출력이 같은 것을보고 싶지 : 알고리즘이 내부 목록의 예 '7','1', '3'의 첫 번째 요소에 따라 중복을 제거해야합니다

[[7, 6, 8],[1, 10],[3, 10],[9, 4],[5, 8]] 

내부 목록의 우선 순위를 정할 때, 즉 더 짧은 것을 먼저 제거해야합니다.

나는이를 사용하여 질문의 첫 번째 부분을 수행하는 방법에 대한 herehere 비슷한 것을 발견

dict((x[0], x) for x in any_list).values() 

을하지만 난 길이의 우선 순위를하는 방법을 모르겠어요.

+0

중복 길이가 같고 내부 목록의 순서가 중요하지 않은 경우 어떤 내부 목록을 제거해야하는지 실제로 신경 쓰지 않습니까? 그렇다면 먼저 내부 목록의 길이로 외부 목록을 정렬하십시오 (https://stackoverflow.com/questions/4735704/ordering-a-list-of-lists-by-lists-len). 그런 다음 언급 한대로 중복을 제거하십시오. – StefanS

답변

2

sorted(any_list, key=len)을 사용하여 길이로 목록을 정렬 할 수 있습니다.

코드는 다음과 다음과 같이 수 :

dict((x[0], x) for x in sorted(any_list, key=len)).values() 

당신은 결국 목록을 가지고 싶다면

는, 단순히 list()에 결과를 전달합니다.

+0

간단하고 간결한, 완벽하게 작동합니다! –

1

당신은 열쇠로이 len()max() 기능을 사용하여 더 이상 하나를 선택할 첫 번째 항목에 따라 목록을 분류하기 위해 collections.defaultdict()을 사용할 수 있습니다 : 당신이 대신 OrdeedDict()를 사용할 수있는 순서에 대해 신경 경우

>>> lst = [[7, 6, 8], [1, 10], [3, 10], [7, 8], [7, 4], [9, 4], [5, 8], [9, 8]] 
>>> from collections import defaultdict 
>>> d = defaultdict(list) 
>>> 
>>> for i, *j in lst: 
...  d[i].append(j) 
... 
>>> d 
defaultdict(<class 'list'>, {1: [[10]], 3: [[10]], 9: [[4], [8]], 5: [[8]], 7: [[6, 8], [8], [4]]}) 
>>> [[k] + max(v, key=len) for k, v in d.items()] 
[[1, 10], [3, 10], [9, 4], [5, 8], [7, 6, 8]] 

:

>>> from collections import OrderedDict 
>>> d = OrderedDict() 
>>> 
>>> for i, *j in lst: 
...  d.setdefault(i, []).append(j) 
... 
>>> [[k] + max(v, key=len) for k, v in d.items()] 
[[7, 6, 8], [1, 10], [3, 10], [9, 4], [5, 8]] 
관련 문제