[파이썬] 랜덤으로 생성된 리스트 중에서 가장 많이 나온 3개 이상의 요소를 뽑고 싶습니다.

조회수 1455회
import random

import collections

from collections import Counter

a=Counter()

number_list=list(range(1, 100)

for i in range(10) :

    c= random.sample(number_list, 10)

    a.update(c)

    c.sort()

    print(c)


common=[m[0] for m in a.most_common(6)]

common.sort()

print(common)

=> 10번의 반복 중 단순히 제일 많이 나온 10개 숫자가아니라 3개 이상 나온 숫자 중 제일 많이 나온 10개의 숫자를 뽑고 싶습니다. 그리고 3개 이상 나오지 않을 경우 다시 처음부터 실행하는 프로그램을 만들고 싶은데 그에 해당하는 함수나 명령어를 모르겠습니다. 파이썬에 입문하지 얼마 안되서 많이 모릅니다. 부디 친절한 답변 부탁드립니다.

1 답변

  • 좋아요

    0

    싫어요
    채택 취소하기

    친절한 답변인지는 모르겠습니다만 한번에 결과가 나오는 은탄환 같은 함수는 없습니다.

    import random
    from itertools import groupby, repeat, chain
    
    number_list=list(range(1, 100))
    
    random_numbers_per_row = (random.sample(number_list, 10) for i in range(10))
    flatten_numbers_with_sorted = sorted(chain(*random_numbers_per_row))
    groupby_numbers = groupby(flatten_numbers_with_sorted)
    groupby_numbers2 = ((list(v)) for k, v in groupby_numbers)
    solve_numbers = list(filter(lambda item:len(item) > 2, groupby_numbers2))
    print(sorted(solve_numbers, key=len, reverse = True))
    
    
    [[31, 31, 31, 31, 31], [70, 70, 70, 70, 70], [3, 3, 3, 3], [32, 32, 32, 32], [28, 28, 28], [34, 34, 34], [58, 58, 58], [75, 75, 75]]
    

    위의 알고리듬은 다음과 같습니다.

    1. 1~100까지 숫자중 10개의 랜덤 숫자를 10번 반복해서 list 10개를 생성했습니다.
    2. 1에서 만든 2중 리스트를 unpack 하여 하나의 리스트에 담고 그것을 정렬을 했습니다. 즉 [[1, 3, 4], [3, 1, 5]] 라면 [1, 1, 3, 3, 4, 5] 로 만들어 준겁니다.
    3. 2의 결과를 groupby 해줍니다.같은 것끼리 묶이게 됩니다.
    4. 3의 결과에서 3번 이상 나온 항목만 추출합니다.
    5. 4의 결과에서 가장 많이 나온 순서대로 정렬해줍니다.
    • 친절한 답변 감사드립니다 많이 배우고 갑니다. 유경훈 2018.3.25 05:59

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)