Python 在列表和字典上重复

Python 在列表和字典上重复,python,dictionary,python-3.x,Python,Dictionary,Python 3.x,在下面的代码中,为什么我的代码没有正确迭代?我可能漏了一行,但我不明白为什么它不起作用 我有一个带有以下测试用例的函数: >>> borda([['A', 'B', 'C', 'D'], ['B', 'A', 'C', 'D'], ['B', 'C', 'D', 'A']]) ('B', [5, 8, 4, 1]) 如果参数中的列表是排名,则每个#1排名得3分,#2排名得2分,#3排名得1分,其他排名得不到任何分数。可能不一定有四种选择。元组中的第一个元素应该是点数最多的选项

在下面的代码中,为什么我的代码没有正确迭代?我可能漏了一行,但我不明白为什么它不起作用

我有一个带有以下测试用例的函数:

>>> borda([['A', 'B', 'C', 'D'], ['B', 'A', 'C', 'D'], ['B', 'C', 'D', 'A']])
('B', [5, 8, 4, 1])
如果参数中的列表是排名,则每个#1排名得3分,#2排名得2分,#3排名得1分,其他排名得不到任何分数。可能不一定有四种选择。元组中的第一个元素应该是点数最多的选项,第二个元素是每个选项按字母顺序获得的点数

我还没有完成这个函数,但是我正在尝试获取一个选择字典,作为按字母顺序排列的键,排名计数作为值,但是输出是一个只包含参数中最后一个列表的最后一个元素的字典

L = ['A', 'B', 'C', 'D'] #This is referenced outside the function since it might change
D = {}
i = 0
num = 0
while num < len(L):
    num += 1
    for choice in L:
        while i < len(parameter):
            for item in parameter:
                if item[0] == choice:
                    D[choice] = D.get(choice, 0) + 3
                if item[1] == choice:
                    D[choice] = D.get(choice, 0) + 2
                if item[2] == choice:
                    D[choice] = D.get(choice, 0) + 1
                i += 1
return D
L=['A',B',C',D']#这是在函数外部引用的,因为它可能会更改
D={}
i=0
num=0
当num
我会这样做:

import operator
from collections import defaultdict
listoflists = [['A', 'B', 'C', 'D'], ['B', 'A', 'C', 'D'], ['B', 'C', 'D', 'A']]

def borda(listoflists):
   outdict = defaultdict(int)
   for item in listoflists:
      outdict[item[0]] += 3
      outdict[item[1]] += 2
      outdict[item[2]] += 1

   highestitem = max(outdict.iteritems(), key=operator.itemgetter(1))[0]
   outlist = [outdict[item[0]] for item in sorted(outdict.keys())]

   return (highestitem, outlist)
更新:
我不知道为什么您不能导入标准模块,但是如果出于任何原因您被禁止使用
import
语句,这里有一个版本只有内置函数:

listoflists = [['A', 'B', 'C', 'D'], ['B', 'A', 'C', 'D'], ['B', 'C', 'D', 'A']]

def borda(listoflists):
    outdict = {}
    for singlelist in listoflists:
        # Below, we're just turning singlelist around in order to
        # make use of index numbers from enumerate to add to the scores
        for index, item in enumerate(singlelist[2::-1]):
            if item not in outdict:
                outdict[item] = index + 1
            else:
                outdict[item] += index + 1

    highestitem = max(outdict.iteritems(), key=lambda i: i[1])[0]
    outlist = [outdict[item[0]] for item in sorted(outdict.keys())]

    return (highestitem, outlist)
如果您有2.7:

import operator
from collections import Counter
listoflists = [['A', 'B', 'C', 'D'], ['B', 'A', 'C', 'D'], ['B', 'C', 'D', 'A']]

def borda(listoflists):
    outdict = sum([Counter({item[x]:3-x}) for item in listoflists for x in range(3]],
                  Counter())
    highestitem = max(outdict.iteritems(), key=operator.itemgetter(1))[0]
    outlist = [outdict[item[0]] for item in sorted(outdict.iteritems(),
                                                   key=operator.itemgetter(0))]
return (highestitem, outlist)
看,妈妈。。无循环:-)


查看为什么这样更好。

您能为您提供的输入提供示例输出吗?我真的不明白你想要你的函数做什么。你是想得到字典还是元组?你有4个嵌套循环。那感觉不对,是吗@jdotjot的解决方案在我看来很好,它只使用一个循环。@jimhark谢谢。公平地说,我也有一个列表理解。对不起,示例输出是
('B',[5,8,4,1])
。我想得到一个元组,但我想我应该先做一本字典。我真的不知道从哪里开始。谢谢你的回答!不过我应该提到我不能导入任何东西,所以我必须坚持使用相当基本的循环。我知道我的解决方案非常混乱,但我只是想掌握整个过程。我摆脱了循环。。。检查我的答案:)@user1797510不确定为什么你不能导入任何东西,但我已经更新了我的答案,在不使用任何标准模块的情况下给出了一个示例。@当然,实际上,你没有摆脱
for
循环,你实际上在你的列表理解中添加了另一个循环。实际上,你在这里有三个循环。列表理解中的
for
循环仍然是一个循环。