无法从列表推导中获得所需的输出

时间:2017-09-21 03:41:06

标签: python-3.x list iteration string-formatting list-comprehension

我正在制定一项计划,以确定选举中的投票是否有效,并计算选票以找到胜利者。预警,我对python和编码很新。

目前,我正在阅读逗号分隔的文本文件中的投票 - 每一行都是一张选票,并且需要检查投票中的每个投票的有效性,其中有效投票是任何正整数且金额相同有候选人的选票(有5名候选人)。投票将通过其他功能进行标准化。

还有另一个函数将候选名称读入列表 - 投票索引在计票时与候选索引匹配。用于确定有效性的rubrick有一些例外,例如,对该候选人的投票空白投票被转换为零,并且完全忽略超过5票的投票。

以下是阅读选票的代码部分。

def getPapers(f, n):

x = f.readlines() #read f to x with \n chars
strippedPaper = [line.strip("\n") for line in x] #stores ballot without \n chars. 
print(strippedPaper)#print without \n chars
print()

strippedBallot = [item.replace(' ', '') for item in strippedPaper] #remove whitespace in ballots
print(strippedBallot) #print w/out white space
print()

#Deal with individual ballots
m = -1
for item in strippedBallot:
    m += 1
    singleBallot = [item.strip(',') for item in strippedBallot[m]]

    print(singleBallot)

getPapers(open("testfile.txt", 'r'), 5)

testfile.txt的内容

1,2, 3, 4

,23,
9,-8
these people!
4,    ,4,4
5,5,,5,5

这是输出

#Output with whitespace.
['1,2, 3, 4 ', '', ', 23, ', '9,-8', 'these people!', '4,    ,4,4', '5,5,,5,5']

#Output with whitespace removed.
['1,2,3,4', '', ',23,', '9,-8', 'thesepeople!', '4,,4,4', '5,5,,5,5']

#Output broken into single ballots by singleBallot.
['1', '', '2', '', '3', '', '4']
[]
['', '2', '3', '']
['9', '', '-', '8']
['t', 'h', 'e', 's', 'e', 'p', 'e', 'o', 'p', 'l', 'e', '!']
['4', '', '', '4', '', '4']
['5', '', '5', '', '', '5', '', '5']

每个单独的投票将被传递给另一个函数以检查有效性和标准化。问题是输出后每个选票的格式化方式,例如['1,2,3,4']被转换为['1','','2','','3','',' 4'] - 第一个问题是如何在不创建空格的情况下消除列表中的逗号?在检查投票时将计算这些空格,并且投票将因为票数多于投票而无效候选人! (空格转换为零投票)。

其次,,['','2','3','']需要读作['','23','']或者它将计为0,2 ,3,0而不是0,23,0,最终的投票结果将是错误的,['9','',' - ','8']应该读作['9','',' -8']或' - ','8'将被视为两票而不是一票无效-8。

是否有比我用于检索逗号分隔项目更好的方法,这不会创建空格并错误地分解列表项?

1 个答案:

答案 0 :(得分:0)

假设您的输入文件如下:

-bash-4.1$ cat testfile.txt
1,2, 3, 4
, 23,
9,-8
these people!
4,    ,4,4
5,5,,5,5

你的程序简化了一点:

def getPapers(f):
    x = f.readlines() #read f to x with \n chars
    strippedPaper = [line.strip("\n") for line in x] #stores ballot without \n chars. 
    print(strippedPaper)#print without \n chars
    print()

    strippedBallot = [item.split(",") for item in strippedPaper] #remove whitespace in ballots
    print(strippedBallot) #print w/out white space
    print()

    for item in strippedBallot:
        print(item)

getPapers(open("testfile.txt", 'r'))