2

在我的家庭作业中真的遇到了这个问题。

' '一切正常,但是当p. 我需要停止创建can.

例如,如果我提交:

rankedVote("21 4", [('AB', '132'), ('C D', ''), ('EFG', ''), ('HJ K', '2  1')])

我想拥有:

['C D', 'AB']

回来了,而不是[]像现在这样。

代码如下:

def rankedVote(p,cs):
    candsplit = zip(*cs)
    cand = candsplit[0]
    vote = list(p)
    ppl = vote
    can = list(p)
    for i in range(len(vote)):
        if ' ' in vote[i-1]:
            return []
        else:
            vote[i] = int(vote[i])
            can[vote[i]-1] = cand[i]

    for i in range(len(vote)):
        for j in range(len(vote)):
            if i != j:
                if vote[i] == vote[j]:
                    return []
    return can

编辑:

在示例中:

rankedVote("21 4", [('AB', '132'), ('C D', ''), ('EFG', ''), ('HJ K', '2  1')])

这意味着第 1AB个变成第 2 个,第 2 个C D变成第 1 个,它应该停止,因为第 3 个不存在。

假设它不是21 4,而是2143。这意味着第三个EFG将是第四个,第四个HJ K将是第三个。

4

2 回答 2

0

代码按照您的指示执行。看下面的代码块:

if ' ' in vote[i-1]:
            return []
于 2012-06-01T03:35:23.593 回答
0

我知道这个问题很老,但我发现它很有趣。

就像之前的答案所说的那样,您直到那时还没有返回列表,您正在返回[].

你应该做的是:

if ' ' in vote[i]:
    return can[:i]

此外,由于您似乎知道如何使用zip,您也可以这样做:

def rankedVote(p,cs):
    cand = zip(*cs)[0]

    # get elements before ' ' 
    votes = p.split()[0] # '21'

    # map votes index order with corresponding list order
    # (number of `cands` is determined by length of `votes`)
    cans = zip(votes, cand) # [('2', 'AB'), ('1', 'C D')]

    # Sort the results and print only the cands
    result = [can for vote, can in sorted(cans)] # ['C D', 'AB']
    return result 

输出:

>> rankedVote("21 4", [('AB', '132'), ('C D', ''), ('EFG', ''), ('HJ K', '2  1')])
['C D', 'AB']
>> rankedVote("2143", [('AB', '132'), ('C D', ''), ('EFG', ''), ('HJ K', '2  1')])
['C D', 'AB', 'HJ K', 'EFG']
于 2013-03-04T22:41:31.007 回答