根据列表列表的长度分配点

时间:2017-11-21 18:35:06

标签: python arrays list loops if-statement

我试图弄清楚如何根据列表中剩余的项目为列表中的某个点分配数字。
例如:

def prizeHandout(prizeWinners):
    for x in range(len(prizeWinners)):
        if len(prizeWinners) == 24:
            prizeWinners[x][2] = (int(prize[0]))
        elif len(prizeWinners) == 12:
            prizeWinners[x][2] = (int(prize[1]))
        elif len(prizeWinners) == 6:
            prizeWinners[x][2] = (int(prize[2]))
    print(prizeWinners)  

我有一个全局变量'prize',这是一个包含奖品[10, 20, 30,....]
的列表 “prizeWinners”位于此格式[[ab, 2, 0], [ba, 5, 0], [aa, 12, 0], .....]的列表中 在“prizeWinners”变量中,“prize”的分配应添加到当前空格[2],如果有,则添加到上一个数字。
似乎无法使这个工作。
任何帮助将不胜感激,谢谢:)

def prizesFunction():
    with open('prizes.csv', 'r') as f:
        reader = csv.reader(f)
        prizePoints = list(reader)
        first= [i[1] for i in prizePoints]
        second = [i[0] for i in prizePoints]
        third = [i[2] for i in prizePoints]
        fourth = [i[3] for i in prizePoints]

    choice = input('Enter your choice [0-4] : ')
    choice = int(choice)
    global prize
    if choice == 1:
        prize = first
        return prize
    elif choice == 2:
        prize =second
        return prize
    elif choice == 3:
        prize = third
        return prize
    elif choice == 4:
        prize = fourth
        return prize

2 个答案:

答案 0 :(得分:2)

首先,首先,这是python,而不是C,所以你应该使用for循环

for prizeWinner in prizeWinners:

这消除了对range()的需求。 "如果我需要知道索引怎么办?"我听你问了吗?好吧,在这种情况下你不是,但如果你这样做,pythonic方式是使用enumerate()像这样

for ii,prizeWinner in enumerate(prizeWinners):

我知道这很迂腐,但让我们来看看这个简单的更改会对您的代码做些什么。

def prizeHandout(prizeWinners):
    for prizeWinner in prizeWinners:
        if len(prizeWinners) == 24:
            prizeWinner[2] = (int(prize[0]))
        elif len(prizeWinners) == 12:
            prizeWinner[2] = (int(prize[1]))
        elif len(prizeWinners) == 6:
            prizeWinner[2] = (int(prize[2]))
    print(prizeWinners)  

已经感觉更好了。
现在,"奖是一个全球变量"已经不好了。因此我们应该将其传递给函数,并且我们将使用默认值 你为什么要把奖作为一个int?我确定你有充分的理由,但如果你想将str转换为int,我建议您使用ast.literal_eval()。我删除了它,因为它在其余问题上没有任何上下文。 至于将奖品添加到奖品获得者[2]中,让我们做出改变。

def prizeHandout(prizeWinners, prize=[10,20,30]):
    for prizeWinner in prizeWinners:
        if len(prizeWinners) == 24:
            prizeWinner[2] += prize[0]
        elif len(prizeWinners) == 12:
            prizeWinner[2] += prize[1]
        elif len(prizeWinners) == 6:
            prizeWinner[2] += prize[2]
    print(prizeWinners)  

我从你的节目中无法回答的是为什么你要通过len(prizeWinners)确定奖品?我想你要做的是看看它们是什么样的索引。所以,这就是enumerate()方便的地方。尝试这个尺寸;这将使得获奖者[2]增加10,如果他们从获奖者名单的前面排在第25位,如果他们是第13位则增加20,如果他们是第7位,则增加30位。

def prizeHandout(prizeWinners, prize=[10,20,30]):
    for ii, prizeWinner in enumerate(prizeWinners):
        if   ii == 24:
            prizeWinner[2] += prize[0]
        elif ii == 12:
            prizeWinner[2] += prize[1]
        elif ii == 6:
            prizeWinner[2] += prize[2]
    print(prizeWinners)  

我只能说这个。我希望你能按照我的步骤。

答案 1 :(得分:2)

好的,既然你得到了一些东西,我会再次分解它。虽然我很确定我仍然不理解,因此无法解决您的问题。但是,我们可以清理一下。

我仍然不喜欢全局变量。您现在可以在代码中执行所需操作,但我告诉您global是关键字,因为它只应在特殊情况下使用。但是,既然你return prize并且没有使用它,在赋值之前或之后我用return值替换了全局,并在函数之外添加了赋值。同样,这是python,而不是C.一切都是对象,通常通过引用传递。所以返回东西是可以的,而不是就地修改。

引起我注意的下一件事是firstfourth的列表推导。关于这一点的三件事,首先是它们是在with块中定义的,这意味着如果打开'prizes.csv'时出错,它们可能是未定义的。所以我将它们作为空列表初始化{ {1}}。接下来,这个列表理解有点我们的顺序是with是第二个值而first是第一个值,所以我重新排列了它。最后,你为什么这样做呢?这将生成一个值列表,表示输入csv的第1列到第4列。 如果我不得不猜测,这意味着你想要创建作为CSV列的奖品。无论如何,至少该列的前4行。

最后,您的问题是类型错误。这就是为什么你真的在这里。 csv.reader的输出是second的列表,您想要的值是str或可能int值。因此,正如我上面提到的,将字符串文字读入python值的安全方法是使用float函数。这可以通过几种方式实现。我认为你的代码中最好的地方是列表理解(我把它留在那里只是为了这个目的)。你可以看到我添加ast.literal_eval()的位置,这个函数将一个字符串作为输入并将其解析为就像它是python代码一样,但不执行它(使它成为ast.literal_eval()的“安全”替代品)这意味着当您尝试将数字添加到一起时,您将无法获得您获得的类型错误。您得到的类型错误是因为python是强类型(并且是动态类型的)。这意味着您无法将eval()添加到str,也不会像JavaScript那样自动将int转换为int

str

好的,这应该有所帮助。还有,它看起来不是很好吗?当你编写python并且它开始看起来很混乱......你可能不是在喋喋不休地做它。 import ast def prizesFunction(): first = [] second = [] third = [] fourth = [] with open('prizes.csv', 'r') as f: reader = csv.reader(f) prizePoints = list(reader) first = [ast.literal_evel(i[0]) for i in prizePoints] second = [ast.literal_evel(i[1]) for i in prizePoints] third = [ast.literal_evel(i[2]) for i in prizePoints] fourth = [ast.literal_evel(i[3]) for i in prizePoints] choice = input('Enter your choice [0-4] : ') choice = int(choice) if choice == 1: return first elif choice == 2: return second elif choice == 3: return third elif choice == 4: return fourth prize = prizesFunction()