如何比较列表和字典值并分配变量

How to compare list and dictionary values and assign a variable

我有一个列表,其中包含一定数量的战斗获胜者,由用户输入,例如winners = ['Hunt', 'Nunes', 'Cormier']

然后我有一个字典,其中每个玩家的正确猜测作为值,他们的名字作为键,然后我的程序将获胜者列表与每个键的值进行比较,并告诉每个玩家他们猜对了多少场比赛

for name in player_dict:
    player_dict[name].sort()
    player_dict[name] = set(player_dict[name]) & set(winners)
    wins = (len(player_dict[name]))
    print(name + ' guessed ' + str(wins) + ' fights correctly.')

我想做的是根据猜对的人数为每场战斗赋予一个值,然后使用该值来确定每个猜对了这场战斗的获胜者的玩家将获得多少彩池.

编辑:这是我的全部代码,以帮助提供清晰度

#!  python3

#fight_gambler.py - a program that lets players gamble on fights with friends

players = []
while len(players) >= 0:
    name = input('Enter a name: ')
    players.append(name)
    if name == '':
        players.pop()
        break
    else:
        pass  

player_dict = {name: [] for name in players} #creates a key for each name with that name as the key
print(player_dict)

fight_amount = int(input('How many fights are there? '))
fight_number = 1
for name in player_dict:                    #adds fight winner prediction as values to each name 

fight_number = 1

while fight_number <= fight_amount:
        answer = input(name + ', who will win fight ' + str(fight_number) + '? ')
        player_dict[name].append(answer)
        fight_number = fight_number + 1
fight_number = 1
winners = []

while fight_number <= fight_amount:                   # creates a list of fight winners
    winner = input('Who won fight ' + str(fight_number) + '? ')
    winners.append(winner)
    fight_number = fight_number + 1
winners.sort()

for name in player_dict:
    player_dict[name].sort()
    player_dict[name] = set(player_dict[name]) & set(winners)
    wins = (len(player_dict[name]))
    print(name + ' guessed ' + str(wins) + ' fights correctly.')

以下计算 正确 猜一个玩家在 players 字典中的次数。如果是这样,您可以使用 listintersection()winnersset 来做到这一点。

此外,还将获奖者名单添加到 运行 total,然后将其转换为 Counter 集合(接受一个可迭代的 returns 一个 key/value 数据结构,该数据结构保持在列表 中找到的相同键的出现次数。由此我们可以推断出必要的猜测数据。

from collections import Counter

winners = set([['Hunt', 'Nunes', 'Cormier'])
players = {'player1': ['Nunes', 'Cormier', 'test1', 'test2'], 
'player2': ['Nunes','test1', 'test2','test3', 'test4'],  
'player3' : ['Hunt', 'Nunes', 'Cormier']}

total = []
for player, picks in players.iteritems():
    inter = winners.intersection(picks)
    total.extend(inter)  # Add to list of winner names.
    print player, 'guessed:', len(inter), 'fights correctly.'

for fighter, guess in Counter(total).iteritems():
    print fighter,'was guessed correctly',guess,'times.' if guess>1 else 'time.'

或者你可以选择更函数式编程的方法(受用户启发:@AMomchilov's想法)。

players_num_correct_picks = dict((k, winners.intersection(v)) for (k, v) in players.items())
for player, picks in players_num_correct_picks.items():
    print player, 'guessed:', len(picks), 'fights correctly.'

total = Counter(item for sublist in players_num_correct_picks.values() for item in sublist)
for fighter, guess in total.items():
    print fighter,'was guessed correctly',guess,'times.' if guess>1 else 'time.'

示例输出:

>>> player2 guessed: 1 fights correctly.
>>> player3 guessed: 3 fights correctly.
>>> player1 guessed: 2 fights correctly.
>>> Cormier was guessed correctly 2 times.
>>> Nunes was guessed correctly 3 times.
>>> Hunt was guessed correctly 1 time.