【问题标题】:Python declare winner using dictionary and loopPython使用字典和循环宣布获胜者
【发布时间】:2018-07-29 01:39:05
【问题描述】:

这是我正在尝试编写的代码的输出。我已经看到这是为 C++ 完成的,但不是带有字典的 python。这里的关键是字典不是可选的。我需要用它来完成任务。

ID  Candidate           Votes Received      % of Total Vote
1   Johnson             5000                55.55
2   Miller              4000                44.44
Total 9000 
and the winner is Johnson!

我需要使用字典和循环来创建它。但是,我被困在 3 点上。 1.percent-current 代码在获得全部总数之前返回百分比 ex:第一个候选人总是有 100%。 2. 声明一个获胜者 - 代码找到最大票数并返回数字值,但我需要它来返回名称。 3. 如何格式化字典值,使其在标题下对齐。我认为不可能,但是出于某种原因必须要求使用字典。我在想我需要复制字典并格式化吗? 这是我目前所拥有的:

totalVotes=[]
dct = {}
i = 1
while(True):
    name = input('Please enter a name: ')
    if name == '':

        break
    votes = input('Please enter vote total for canidate: ')
    totalVotes.append(votes)
    totalVotesInt= map(int, totalVotes)
    total = sum(totalVotesInt)
    dct[i] = {name,votes,int(votes)/total*100}
    i += 1
header='{:>0}{:>10}{:>10}{:>20}'.format('ID','Name','Votes','% of Total Vote')
print(header)    
print("\n".join("{}\t{}".format(key, value) for key, value in dct.items()))
print('Total '+str(total))
print('The Winner of the Election is '+max(totalVotes))

返回:

    Please enter a name: Smith
    Please enter vote total for canidate: 100
    Please enter a name: Frieda
    Please enter vote total for canidate: 200
    Please enter a name: West
    Please enter vote total for canidate: 10
    Please enter a name: 
    ID      Name     Votes     % of Total Vote
    1   {'Smith', '100', 100.0}
    2   {'Frieda', 66.66666666666666, '200'}
    3   {3.225806451612903, '10', 'West'}
    Total 310
    The Winner of the Election is 200

【问题讨论】:

  • 检查我写的代码。 PS-它是用 Python 3 编写的。

标签: python loops dictionary vote


【解决方案1】:

我对您的代码添加了很少的更改以使其正常工作:

我已经在代码中以 cmets 的形式提到了这些变化。

编辑:如果您将来需要缩放,则为每个候选对象使用对象会更有效。

totalVotes=[]
dct = {}
i = 1
while(True):
    name = input('Please enter a name: ')
    if name == '':

        break
    votes = input('Please enter vote total for canidate: ')
    totalVotes.append(votes)
    totalVotesInt= map(int, totalVotes)
    total = sum(totalVotesInt)
    # I change it to a list so it's much easier to append to it later
    dct[i] = list((name,int(votes)))   
    i += 1

# I calculate the total percent of votes in the end and append to the candidate

maxVal = 0
for i in range(1, len(dct) + 1):
    if dct[i][1] > maxVal:
        maxInd = i
    dct[i].append(int((dct[i][len(dct[i]) - 1]) / total * 100))

header='{:>0}{:>10}{:>10}{:>20}'.format('ID','Name','Votes','% of Total Vote')
print(dct)
print(header)    
print("\n".join("{}\t{}".format(key, value) for key, value in dct.items()))
print('Total '+str(total))
print('The Winner of the Election is '+ dct[maxInd][0]))

【讨论】:

  • 谢谢@R.p.T,看起来这个正在带回最后一个条目。我认为这是因为 maxVal 正在评估密钥而不是投票?
  • 是的,如果您注意到,在 for 循环中,当代码添加每个候选人的投票百分比时(我希望我首先获得所有选票后在单独的部分中这样做的原因很清楚t你),我计算字典中具有最大票数的索引并将索引存储在maxInd中。现在我有了索引,我只需在字典中的索引maxInd 处打印出候选人的name
  • 因为它是最大百分比,我希望它输出获胜者 - 但它每次都输出最后一个输入,即使他们的票数最少。
【解决方案2】:
  1. 在计算每个候选人的投票百分比的同时,您可以添加每个候选人的投票数。您需要先找到总票数,然后将每个候选人的票数除以总票数

  2. 您正在返回整数列表的最大值。显然你不会得到一个字符串。您需要某种方式将票数与候选人联系起来。

  3. 别打扰了。您可以尝试弄清楚需要多少个标签才能将整个内容排成一行,但根据经验,这基本上是不可能的。你可以用逗号分隔它们,然后在 excel 中以 csv 格式打开它,或者你可以让用户弄清楚什么数字与什么相配。

另一个答案使用数据表,所以我将采用另一种更普通、更酷的方法来获得你想要的东西。

class candidate():

  def __init__(self, name, votes):
    self.name = name
    self.votes = int(votes)

  def percentvotes(self, total):
    self.percent = self.votes/total

  def printself(self, i):
    print('{}\t{}\t\t{}\t\t{}'.format(i, self.name, self.votes, self.percent))

def getinput():
  inp = input('Please enter your candidates name and votes')
  return inp
candidates = []
inp = getinput()
s = 0
while inp != '':
  s+=1
  candidates.append(candidate(*inp.split(" ")))
  inp = getinput()

for c in candidates:
  c.percentvotes(s)

candidates.sort(key = lambda x:-x.percent)

print('ID\tname\t\tvotes\t\tpercentage')
for i, c in enumerate(candidates):
  c.printself(i+1)

【讨论】:

  • 嗨,关于这段代码的几个问题。字典组件在哪里?那是“lambda”部分吗?为什么将变量命名为“self”,它代表什么?
  • @new.user 我没有使用字典。我创建了一个名为 Candidate 的类,它有几个你需要的属性和函数。它可能超出你所学的范围。我认为 R.p.T 在他的回答中坚持你的方式做得很好。
  • 是的,不幸的是它不起作用,不断返回最后一个输入而不是投票最多的候选人。谢谢@SamCraig
【解决方案3】:

我相信这就是您正在寻找的解决方案。如果您使用的是 Python 2.x,只需更改输入语句。使用 Dataframe,输出将完全符合您的要求。

import pandas as pd
import numpy as np
df = pd.DataFrame(columns=["Candidate", "Votes Received","Percentage of total votes"])
names=list()
votes=list()
while True:
    name = str(input("Enter Name of Candidate."))
    if name=='':
        break
    else:
        vote = int(input("Enter the number of votes obtained."))
        names.append(name)
        votes.append(vote)
s=sum(votes)
xx=(votes.index(max(votes)))
myArray = np.array(votes)
percent = myArray/s*100

for i in range(len(names)):
    df1 = pd.DataFrame(data=[[names[i],votes[i],percent[i]]],columns=["Candidate", "Votes Received","Percentage of total votes"])
    df = pd.concat([df,df1], axis=0)

df.index = range(len(df.index))
print (df)
print ("Total votes = ",s)
print ("The man who won is ",names[xx])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-13
    相关资源
    最近更新 更多