2012-11-25 5 views
0

연습용 코드를 작성하려고했는데, 정상적으로 작동하지만 두려운 것처럼 보였습니다. 필요하지 않은 것을 제거 할 수있는 사람이 있는지 궁금합니다. 일부 기능을 결합 하시겠습니까? 여기 목록에 항목 추가하기 - Python

이 기능의 사용의 예 :

choices([['YES', 'NO', 'YES', 'YES'], ['NO', 'NO', 'YES', 'NO'], ['YES', 'YES', 'YES', 'YES']]) 

목록 내의 각 목록은 네 개의 예/아니오 선택이있다 (물론 목록 네 가지 옵션 아래 지표, 예를 들면, 녹색, 빨강, 파랑, 노랑; 하지만 네 가지 일 필요는 없습니다.) 목록에있는 목록의 수는 얼마나 많은 사람들이 투표를했는지입니다.

i = 0 
num = 0 
total_num = 0 
num_choices = len(INDICES) 
choices_index = 0 
choices_votes = [] 
choices_votes_num = [] 
index = 0 
total_choices = [] 
winning_choice = '' 
winning_index = 0 
while i < len(parameter): 
    while num < num_choices: 
     for item in parameter: 
      choices_votes.append(item[num]) 
     num += 1 
    i += 1 
while total_num < len(choices_votes): 
    if choices_votes[total_num] == 'YES': 
     choices_votes_num.append(1) 
     total_num += 1 
    elif choices_votes[total_num] == 'NO': 
     choices_votes_num.append(0) 
     total_num += 1 
while choices_index < len(choices_votes_num): 
    count = int(len(choices_votes_num)/num_choices) 
    total = 0 
    total = sum(choices_votes_num[choices_index:(choices_index + count)]) 
    total_choices.append(total) 
    choices_index = choices_index + count 
for score in total_choices: 
    winning_index = max(total_choices) 
    winning_choice = INDEX_TO_NAME[total_choices.index(winning_index)] 
return winning_choice, total_choices 

INDEX_TO_NAME은 색인을 선택 항목 (색상)에 연결하기 위해 설정된 사전입니다.

기본적으로 코드는 각 예를 1 포인트로 계산하고 각 숫자를 0 포인트로 계산하고 사용 가능한 각 선택 항목의 총점을 합한 다음 합계와 승자를 반환합니다.

c = [['YES', 'NO', 'YES', 'YES'], 
    ['NO', 'NO', 'YES', 'NO'], 
    ['YES', 'YES', 'YES', 'YES']] 

INDICES = ['red', 'green', 'blue', 'yellow'] 

당신이 어쨌든 설문 조사를 소스로 INDICES을 사용하고 있기 때문에, 우리는 대답은 항상 INDICES의 수와 줄 것이라고 가정 할 수있다 :

답변

4

로 시작 할 수 있습니다.

우리는 zip의 사용이 데이터를 재구성 할 수 있습니다 :

zip(*c) 
#[('YES', 'NO', 'YES'), 
# ('NO', 'NO', 'YES'), 
# ('YES', 'YES', 'YES'), 
# ('YES', 'NO', 'YES')] 

이 인수에 대한 답변을 확장하고는 실제 인덱스에 의해 그룹화 할 수 재결합. 그래서 첫 번째 인덱스는 두 번째, '녹색'이다, '레드'는 등 지금

우리가 인덱스와 조합을 다시 압축 할 수 있습니다

results = zip(INDICES, zip(*c)) 
#[('red', ('YES', 'NO', 'YES')), 
# ('green', ('NO', 'NO', 'YES')), 
# ('blue', ('YES', 'YES', 'YES')), 
# ('yellow', ('YES', 'NO', 'YES'))] 

그리고 우리가 할 수있는 루프 results을 통해, 단순히 발생을 계산 '예':

totals = [(ind, answers.count('YES')) for ind,answers in results] 
#[('red', 2), ('green', 1), ('blue', 3), ('yellow', 2)] 

그래서 여기에 총계가 있습니다.

max(totals, key=lambda x: x[1]) 
#('blue', 3) 

max가 첫 번째 인덱스의 기본 모양으로, 그래서 우리는 그것이 당겨 지시 그것을 key 기능을 전달할 수있는 것입니다 : 우리는 승자였다 어느 말해 가지고 max에 대한 호출이를 전달할 수 색인 대신 1을 입력하십시오. 그것은 우리에게 파란색이 승자임을 보여줍니다.

totals = ((ind, answers.count('YES')) for ind,answers in results) 
#<generator object <genexpr> at 0x102581fa0> 
max(totals, key=lambda x: x[1]) 
#('blue', 3) 

마지막 하나의 문은 다음과 작성할 수 있습니다 :

더 효율적으로 , 우리는 실제로 max에 발전기를 통과 할 수

max(((ind, answers.count('YES')) for (ind,answers) in zip(INDICES, zip(*c))), 
    key=lambda x: x[1]) 

나는이 답을 알고 일부 지능형리스트를 소개합니다 및 람다 (및 발전기),하지만 당신은 그것을 청소하는 방법을 요청하고 이것은 당신에게 사용할 수있는 도구의 예입니다. 다행히도 이것은 당신에게 필요한 도움을줍니다!

참고 :이 대답은 동점을 고려하지 않았습니다. 그러나이 예제를 실제 코드에 통합하기 위해 여기에서 작업 할 수 있다고 확신합니다.

+0

고마워요! 그게 도움이! – user52610