Немного изменив вывод

Вопрос:

voting_borda:

(список списка str) -> кортеж (str, список int)

Параметр представляет собой список из 4-элементных списков, которые представляют рейтинговые бюллетени для одной поездки.

Количество Борда определяется путем начисления очков в соответствии с рейтингом. Сторона получает 3 балла за каждый рейтинг первого выбора, 2 балла за каждый рейтинг второго выбора и 1 балл за каждый рейтинг третьего выбора. (За четвертое место баллы не присуждаются.) Например, рейтинговое голосование, показанное выше, внесет 3 балла в подсчет либералов, 2 балла в подсчет зеленых и 1 балл в подсчет КПК. Сторона, набравшая наибольшее количество очков, получает место.

Возвратите кортеж, где первый элемент — это имя победившей стороны в соответствии с числом Борда, а второй элемент — это список из четырех элементов, содержащий общее количество очков для каждой стороны. Порядок элементов списка соответствует порядку сторон в PARTY_INDICES.

Это мой код:

def voting_borda(*args):
results = {}
for sublist in args:
    for i in range(0, 3):
        if sublist[i] in results:
            results[sublist[i]] += 3-i
        else:
            results[sublist[i]] = 3-i

winner = max(results, key=results.get)
results_sort = sorted(results,key=lambda x:x[1],reverse=True)
return winner, results_sort

Однако, если я попытаюсь

voting_borda(['GREEN','NDP', 'LIBERAL', 'CPC'],['GREEN','CPC','LIBERAL','NDP'],['LIBERAL','NDP', 'CPC', 'GREEN'])

Я получил,

('GREEN', {'NDP': 4, 'CPC': 3, 'GREEN': 6, 'LIBERAL': 5})

Но я хочу, чтобы первый параметр был победителем (с этой частью все в порядке), а второй параметр был просто значениями, а также в порядке PARTY_INDICES, который равен PARTY_INDICES = [NDP_INDEX, GREEN_INDEX, LIBERAL_INDEX, CPC_INDEX].

любые решения или способы, которыми я мог бы сделать это лучше?


person user1864828    schedule 30.11.2012    source источник
comment
Я уже сделал это! но этот вопрос отличается от этого   -  person user1864828    schedule 30.11.2012
comment
Ха-ха, и здесь тоже: одобрение голосованием через 3 часа%23comment18707069_13637068">stackoverflow.com/questions/13637068/   -  person sberry    schedule 30.11.2012
comment
да .. наши профессионалы не так уж полезны в этом году.   -  person user1864828    schedule 30.11.2012
comment
Я думаю, он поймет, что что-то не так, когда вы все придете с одним и тем же ответом, но никто из вас его не поймет. PS это тоже   -  person engineerC    schedule 30.11.2012
comment
Не могли бы вы помочь мне или дать мне подсказку в правильном направлении?   -  person user1864828    schedule 30.11.2012


Ответы (1)


Индекс (NDP_INDEX и т. д.) действительно не нужен и не является питоническим. Просто используйте строку, и если вам нужно отсортировать ее по чему-то, используйте списки кортежей.

 vv = [ ('republican',3), ('democrat',9), ('libertarian',73), ('green',-2) ]
 vsort = sorted(vv,key=lambda x:x[1],reverse=True)
 print(list(party for party, value in vsort))

Вы можете сделать что-то подобное, чтобы получить ответ. Ненавижу делать за тебя всю работу...

person engineerC    schedule 30.11.2012
comment
не могли бы вы объяснить, что такое key=lambda, мы еще этого не узнали! - person user1864828; 30.11.2012
comment
Лямбда-функция — это безымянная встроенная функция. lambda x: x[1] эквивалентно def f(x): return x[1]. Это говорит sorted, чтобы отсортировать функции по второму элементу каждого кортежа. (psst прочитайте страницу, на которую я дал ссылку) - person engineerC; 30.11.2012
comment
есть более простой способ? я настоящий новичок, мы еще не научились обратному = правда, что либо :*(.. это расстраивает - person user1864828; 30.11.2012
comment
Ну, об этом говорилось на странице, на которую я дал вам ссылку (подтолкнуть, подмигнуть, подмигнуть). reverse — это аргумент ключевого слова, который определяет, является ли сортировка по возрастанию или по убыванию. А лямбда находится здесь. Сначала будет сложно, особенно если это ваш родной язык, но держитесь. Эй, по крайней мере, у тебя не будет никаких вредных привычек от C. :) - person engineerC; 30.11.2012
comment
Да это правда. Вы могли бы сделать то же самое, используя функцию reverse или reversed постфактум, но более эффективно пойти дальше и позволить функции sorted сделать все таким образом. - person engineerC; 30.11.2012
comment
теперь я полностью понимаю, что ты говоришь. тем не менее, я отредактировал код, но теперь вывод ('ЗЕЛЕНЫЙ', ['ЗЕЛЕНЫЙ', 'CPC', 'LIBERAL', 'NDP']). как мне сделать так, чтобы он давал значения? :( - person user1864828; 30.11.2012
comment
Если вы используете list(party for party, value in vsort), используйте значение для партии вместо партии для партии. Прочтите это как предложение - Составьте список сторон, для каждой партии и значения в моем отсортированном массиве. - person engineerC; 30.11.2012
comment
Подожди, я снова потерял тебя. я отредактировал свой код. если я это сделаю, я получу («ЗЕЛЕНЫЙ», [«ЗЕЛЕНЫЙ», «КПК», «ЛИБЕРАЛЬНЫЙ», «НДП»]). но я хочу значения - person user1864828; 30.11.2012