0

私は演習用のコードを書き込もうとしていましたが、正常に機能しているように見えますが、恐ろしいように見えます。必要のないものを削除して、機能の一部を組み合わせるだけでよいのではないかと考えていました。

関数の使用例を次に示します。

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

リスト内の各リストには、4つのはい/いいえの選択肢があります(以下のインデックスには、緑、赤、青、黄色などの4つのオプションもリストされていますが、4つである必要はありません)。リスト内のリストの数は、投票した人の数です。

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インデックスを選択肢(色)に接続するために設定された単なる辞書です。

基本的に、コードは各yesを1ポイント、各noを0ポイントとしてカウントし、使用可能な各選択肢の合計ポイントを合計して、合計と勝者を返すことになっています。

4

1 に答える 1

4

始めましょう:

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

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

とにかく投票を調達するために使用INDICESしていたので、回答は常にの数と一致すると想定できますINDICES

zipこのデータを再編成するために利用できます。

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

これにより、引数への回答が拡張され、実際のインデックスでグループ化されるように再結合されます。したがって、最初のインデックスは「赤」、2番目のインデックスは「緑」などです。

これで、もう一度zipして、インデックスと組み合わせることができます。

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

resultsそして、「YES」の発生を数えるだけで、ループすることができます。

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

合計がここにあります。これを呼び出しに渡して、maxどちらが勝者であるかを教えてもらうことができます。

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

maxデフォルトでは最初のインデックスを参照するため、代わりkeyにインデックスをプルするように指示する関数を渡すことができます。1青が勝者だったことを示しています。

より効率的にするために、実際にジェネレータをmax次の場所に渡すことができます。

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(((ind, answers.count('YES')) for (ind,answers) in zip(INDICES, zip(*c))), 
    key=lambda x: x[1])

この回答でリスト内包表記とラムダ(およびジェネレーター)が導入されていることは知っていますが、それをクリーンアップする方法を求められました。これは、使用可能なツールの例です。うまくいけば、これはあなたが必要な助けをあなたに与えるでしょう!

注:この回答では、同点は考慮されていません。ただし、ここから作業して、これらの例を実際のコードに統合できると確信しています。

于 2012-11-25T03:28:55.237 に答える