2017-11-15 6 views
1

목록을 받고 반복 된 요소가있는 다른 목록을 반환하는 함수를 만들려고합니다.목록의 반복 요소 그룹화

예를 들어 A = [2,2,1,1,3,2] 입력의 경우 (목록이 정렬되지 않음)이 함수는 result = [[1,1], [2,2,2]]을 반환합니다. 결과를 정렬 할 필요가 없습니다.

이미 Wolfram Mathematica에서 작성했지만 이제는 python3으로 변환해야합니다. Mathematica는 Select, Map 및 Split과 같은 몇 가지 기능을 제공하므로 많은 지침이있는 긴 루프를 사용하지 않고도 매우 간단합니다.

+0

목록이 분류되어 있습니까? – Engineero

답변

3
result = [[x] * A.count(x) for x in set(A) if A.count(x) > 1] 
+0

좋은 소식! 세트를 사용하지 않기 때문에 모든 것을 인라인 할 수 있습니다. 당신은 결국 조건부가 필요하지 않습니다, 그것 없이는 더 예뻐요. –

+0

와우 - 심지어 더 좋았어요 –

+0

우수 : D 정말 고마워요. – Gabriela

2

간단한 방법 :

def grpBySameConsecutiveItem(l): 
    rv= [] 
    last = None 
    for elem in l: 
     if last == None: 
      last = [elem] 
      continue 
     if elem == last[0]: 
      last.append(elem) 
      continue 
     if len(last) > 1: 
      rv.append(last) 
     last = [elem] 
    return rv 


print grpBySameConsecutiveItem([1,2,1,1,1,2,2,3,4,4,4,4,5,4]) 

출력 : 당신이 분류 또는 대한 Inputlist를 정렬해야 할 경우 당신은 당신은 더 이상 연속 동일한 번호를 얻을 wouldnt가, 나중에 당신의 출력을 정렬 할 수 있습니다

[[1, 1, 1], [2, 2], [4, 4, 4, 4]] 

그래도.

색인에 따라 목록을 정렬하는 방법은 https://stackoverflow.com/a/4174955/7505395을 참조하십시오. 내부 목록이 모두 동일하므로 색인을 사용하여 목록을 정렬하는 방법은 0을 사용하십시오.

def grpByValue(lis): 
    d = {} 
    for key in lis: 
     if key in d: 
      d[key] += 1 
     else: 
      d[key] = 1 
    print(d)  

    rv = [] 
    for k in d: 
     if (d[k]<2): 
      continue 
     rv.append([]) 
     for n in range(0,d[k]): 
      rv[-1].append(k) 
    return rv 



data = [1,2,1,1,1,2,2,3,4,4,4,4,5,4] 

print grpByValue(data) 

출력 :

[[1, 1, 1, 1], [2, 2, 2], [4, 4, 4, 4, 4]] 
+0

답을 고맙게 생각하지만 찾고있는 결과가 아닙니다. 해당 입력에 대해 출력은 [[1,1,1,1], [2,2,2], [4,4,4,4]] (정렬 필요 없음)이어야합니다. 전체 목록에서 반복되는 요소 만. – Gabriela

+0

@ 가브리엘라 : 그 간단한 해결책. 먼저 입력을 정렬하면 동일한 숫자가 정렬에 따라 그룹화되고 algo가 출력을 제공합니다 (ogo가 무엇을하는지 알기 이름 참조). –

+0

@Gabriela : 2.구현 : 사전에 그들을 카운트, dict에서 목록을 만들 :) 출력은 이제 괜찮습니다 –

1

당신은 수를 연속 사람을 무시합니다

를 사용하면 훨씬 똑똑 보이는, 그냥 그들 모두를 수집 -

또한 itertools - it hast things like TakeWhile 사용할 수 있습니다 목록 이해력으로이 작업을 수행하십시오.

A = [1,1,1,2,2,3,3,3] 
B = [] 
[B.append([n]*A.count(n)) for n in A if B.count([n]*A.count(n)) == 0] 

출력

[[1,1,1],[2,2],[3,3,3]] 이상 pythonically : 당신이 손 전에 목록을 정렬해야하는 경우

A = [1,2,2,3,4,1,1,2,2,2,3,3,4,4,4] 
B = [] 
for n in A: 
    if B.count([n]*A.count(n)) == 0: 
     B.append([n]*A.count(n)) 

출력 정렬 또는 정렬되지 않은 목록 [[1,1,1],[2,2,2,2,2],[3,3,3],[4,4,4,4]]

작품은, 당신은 할 수 for n in sorted(A)

+0

매우 짧고, 멋져야합니다. –

1

이것은의 직업입니다.. x 각 요소를 반복하고 A.count(x)을 검사하는 것은 O (N^2) 복잡도를가집니다. Counter()은 한 번에 반복되는 각 요소가 반복되는 횟수를 계산 한 다음 해당 사전을 반복하여 결과를 생성 할 수 있습니다.

>>> from collections import Counter 
>>> A = [2,2,1,1,3,2] 
>>> counts = Counter(A) 
>>> result = [[key] * value for key, value in counts.items() if value > 1] 
>>> result 
[[2, 2, 2], [[1, 1]]