使用Python进行元组和列表操作。切割元组一代短

时间:2012-06-01 03:12:48

标签: python list variables tuples

在我的家庭作业中真的坚持这个问题。

一切正常,但' '中有空格(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')])

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

我们说21 4代替2143而不是EFG。 这意味着第3个HJ K将是第4个, 第4个{{1}}将是第3个。

2 个答案:

答案 0 :(得分:0)

代码按照您的指示行事我会说。请看下面的代码块:

if ' ' in vote[i-1]:
            return []

答案 1 :(得分:0)

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

就像previous answer所说的那样,到目前为止你没有返回列表,你正在返回[]

你应该做的是:

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']