考えられるすべての票を生成する必要はありません。possiblevotes
既存の投票が可能かどうかを簡単に計算できるため、リストを生成しなくても実際の投票をテストできます。
また、実際には「滞在」票のみをカウントします。一致する 'stay go' 投票を探すことは問題ではありません。true である 'stay go' 投票はすべてtruem == n
でm.split()[0] == n.split()[0]
あるためです。したがって、最初のカウントを削除して、2 番目のカウントのみを確認することもできます。
これで、投票の最大数を見つけることができましたstay
。a を使用すると、collections.Counter()
物事を簡単に数えることができます。
import collections
vote_counts = collections.Counter(v.split()[0] for v in votes)
maxsat = vote_counts.most_common(1)[0][1] # retrieve the most popular count
これは、コードが計算したのと同じ数を計算しますが、投票を 1 回ループするだけで済み、「滞在」投票のみをカウントする必要があります。
numcats * numdogs
これを、最初にループ時間を、次にループ時間をループするループと対比してくださいnumcats * numdogs * 2 * len(votes)
。3 * numcats * numdogs
それはより大きな要因です。
最初に投票を検証する必要がある場合は、次を使用できます。
from itertools import ifilter
numcats = int(numcats)
numdogs = int(numdogs)
def validvote(vote):
stay, go = vote.split()
cat, dog = sorted((stay, go))
if (cat[0], dog[0]) != ('C', 'D'):
return False
if not (1 >= int(cat[1:]) >= numcats):
return False
if not (1 >= int(dog[1:]) >= numdogs):
return False
return True
vote_counts = collections.Counter(v.split()[0] for v in ifilter(validvote, votes))
go投票の使用を開始することもできます。
stay_votes = collections.Counter()
go_votes = collections.Counter()
for vote in ifilter(validvote, votes):
stay, go = vote.split()
stay_votes[stay] += 1
go_votes[go] += 1
これで、滞在投票の集計からゴー投票を単純に差し引くことができます(集計が 0 になった場合は削除されます)。
total_votes = stay_votes - go_votes
# Display top 10
for creature, tally in total_votes.most_common(10):
print('{}: {:>#5d}'.format(creature, tally))
もちろん、一度に計算を行うこともできます。
total_votes = collections.Counter()
for vote in ifilter(validvote, votes):
stay, go = vote.split()
total_votes[stay] += 1
total_votes[go] -= 1
しかし、投票の集計を別々にしておくことは、後の分析にとって興味深いかもしれません。