2012-04-20 2 views
1

Назначение записывается в строке документации моих ПРОФ:Обновление значения Dict в Python

def evaluateBallot (voterPreferences, candidates): 
    """ 
    Using voterPreferences (a dict associating each voter with a list of 
     candidate names ordered from highest to lowest preference) and 
     candidates(a set of candidates still remaining in the election), 
     returns the vote distribution: a dict associating the name of each 
     candidate in the election to the number of votes that they received 
    >>> result = evaluateBallot(dict(x=['a','b','c'], y=['a','c','b'],z= ['c','a','b']),set(['b','c'])) 
    >>> (result['b'],result['c']) 
    (1, 2) 
    """ 

    d ={} 
    for candidate in candidates: 
     d[candidate] = 0 
    for voterPreference in voterPreferences: 
     if candidate == voterPreference[0]: 
      d[candidate] += 1 
    return d 

Когда я запускаю код, который я написал, словарь не обновляется +1 за каждый раз, когда кандидат является избирателем лучший выбор. Я чувствую, что ошибка в моем выражении if, но я не уверен, что это такое?

+0

Действительно ли это ваш отпечаток? – jamylak

+0

Ваш отступ ошибочен. – hjpotter92

+0

Нет, это не мой отпечаток. –

ответ

1

Если данные, как то, что вы описали в комментариях, то я думаю

for voterPreference in voterPreferences: 

должен быть изменен на

for voterPreference in voterPreferences.values(): 

так, что вы хотите voterPreference быть это [ «а», 'b', 'c'], но не 'x'.

P.S. Я не совсем понимаю, почему вывод должен быть b = 1 и c = 2. Как вы хотите обрабатывать с помощью, если он не существует в кандидатах, но существует в voterPreferences? Игнорирование? Если это так, вам нужно больше логики в вашем методе, чтобы справиться с этим.

Дополнительной

По вашим комментариям, похоже, что не-кандидаты должны быть проигнорирован при расчете конечного результата:

def evaluateBallot(voterPreferences, candidates): 
    d = {} 
    voterPrefCandOnly = [] # Just use list since we don't care about who voted 

    # Remove votes for non-candidates 
    for voterPref in voterPreferences.values(): 
     filtered = filter(lambda x: x in cand, voterPref) 
     voterPrefCandOnly.append(filtered) 

    # Calculate the result for voting 
    for candidate in candidates: 
     d[candidate] = 0 
     for voterPref in voterPrefCandOnly: 
      if candidate == voterPref[0]: 
       d[candidate] += 1 
    return d 

voterPref = dict(x=['a','b','c'], y=['a','c','b'], z=['c','a','b']) 
cand = set(['b','c']) 
result = evaluateBallot(voterPref, cand) 
print (result['b'], result['c']) # (1, 2) 
+0

Я внес изменения, но он по-прежнему не обновляет словарь? Что касается вывода в докштрине ... Я не совсем уверен. Мой профессор написал все в цитатах. –

+0

@ kk.lau В соответствии с результатом в цитатах, не-кандидаты, такие как «а», следует игнорировать из предпочтений избирателей, поэтому ['a', 'b', 'c'] равно ['b', ' c '] в примере. Я обновил свой ответ соответственно. – Hailei

+0

Я думаю, что вы, возможно, опережаете то, что я должен сделать для этой части кода. Следующая функция, которую я должен написать, касается претендентов на замещение, поэтому я не думаю, что часть фильтра необходима для моих целей. Поэтому, помимо этого, я должен сделать предпочтения в списке и получить доступ к нему таким образом? –

0

Я считаю, что назначение предполагает читатель принимает доказанный определенный вид стоковое голосование. И, таким образом, кажется, что учитель также подразумевает, что «каждый человек будет голосовать ровно на один голос, и этот голос будет передан их кандидату с наивысшим рейтингом, который находится в candidates»

Это полный ответ, который вы можете проверить на свою работу против, когда закончите, или, если вы застряли в течение длительного времени, или вы хотите, чтобы проверить свои предположения:

def evaluateBallot(voterPreferences, candidates): 
    """ 
     . . . 
    """ 
    votes = collections.Counter() # or collections.defaultdict(lambda: 0) 

    for voter,prefOrdering in voterPreferences.items():    
     for desiredCandidate in prefOrdering: # go through each person's preference list 
      if desiredCandidate in candidates: # if candidate is still in the running      
       # then this person votes for that candidate 
       votes[desiredCandidate] += 1 
       break 
     # it is possible that the person casts no votes 

    return dict(votes) 
+0

ясно, что его еще нет, но давайте не будем делать домашнее задание для него ... он просто хотел пройти мимо блока, который у него был, - я уверен, что он оставил конец в конце – chees

+0

@chees «Она», на самом деле :) ninjagecko: Я буду использовать это, чтобы проверить мой ответ - спасибо –

0
for candidate in candidates: 
    d[candidate] = 0 

После этого цикла отделки, candidate имеет значение то, что последний кандидат был в candidates.

for voterPreference in voterPreferences: 
    if candidate == voterPreference[0]: 
     d[candidate] += 1 

В этом цикле мы используем, что оставшиеся candidate значения, и только голоса обновления для этого кандидата.

Я предполагаю, что вы хотите сделать, это проверить, что voterPreference[0] является действительным кандидатом. Чтобы сделать это, мы можем проверить, если voterPreference[0] является in существующим d и обновлять соответственно:

for voterPreference in voterPreferences: 
    if voterPreference[0] in d: 
     d[voterPreference[0]] += 1 

Мы можем упростить это, используя кортеж распаковки для voterPreference, если мы знаем, сколько элементов долго это, или назначая voterPreference[0] другой переменной. Кроме того, ваш 3-пространственный отступ нестандартен; пожалуйста, переходите на 4 :)

Смежные вопросы