根据列表长度分配点

2024-09-30 22:14:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我想知道如何根据列表中剩余的项目数为列表中的某个点分配数字。
例如:

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

Tags: in列表forlenreturnifdef数字
2条回答

好吧,既然你从中得到了一些东西,我再把它分解一下。虽然我很确定我还是不明白,因此,不能解决你的问题。但是,我们可以清理一下。你知道吗

我还是不喜欢全局变量。现在在代码中做你想做的,但是我要告诉你global是一个关键字,因为它应该只在非常情况下使用。但是,因为您return prize并且不使用它,所以在赋值之前或之后,我用return值替换了全局值,并在函数之外添加了赋值。同样,这是python,而不是C。所有东西都是一个对象,通常通过引用传递。所以可以退货,不修改到位。你知道吗

接下来引起我注意的是firstfourth的列表理解。关于这一点,有三件事,首先是它们是在with块中定义的,这意味着如果打开时出错,它们可能是未定义的奖品.csv'因此我将它们初始化为with的空列表。接下来,这个列表理解是我们的顺序,因为first是第二个值,second是第一个值,所以我重新排列了它。最后,你到底为什么要这么做?这将生成一个值列表,这些值表示输入csv的第1列到第4列。 如果非要我猜的话,这意味着要创建CSV列中的奖品。至少该列的前4行。你知道吗

最后,你的问题是类型错误。这就是你来这里的原因。输出csv.reader文件是str的列表,您需要的值是intfloat值。因此,如前所述,将字符串文本读入python值的安全方法是使用ast.literal_eval()函数。这可以通过两种方式实现。我认为代码中最好的地方是列表理解(我把它们放在那里就是为了这个目的)。您可以看到我在哪里添加了ast.literal_eval(),这个函数将一个字符串作为输入,并像解析python代码一样解析它,但不执行它(使它成为eval()的“安全”替代方法),这意味着当您尝试将这些数字相加时,不会得到您得到的类型错误。您得到这个类型错误是因为python是强类型的(并且是动态类型的)。这意味着您不能将str添加到int,也不会像JavaScript那样自动将int转换为str。你知道吗

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()

好的,这应该有点帮助。还有,看起来不错吧?当你在写python的时候,它开始看起来很混乱。。。你可能不是在用肾盂手术。import this

首先,这是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)  

已经感觉好多了。
现在,“奖金是一个全局变量”已经不好了。所以我们应该将其传递到函数中,然后使用默认值。
你为什么要把奖品当作智力来投?我相信你有一个很好的理由,但如果这个理由恰好是你正在将str转换成int,我建议你使用ast.literal_eval()。我要删除它,因为它与你的问题没有任何关联。 至于把奖品加在获奖者身上,让我们做出改变。你知道吗

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(获奖者)来决定奖品?我想你要做的是看看它们在数组中是什么索引。所以,这就是enumerate()很方便的地方。试着穿上这件衣服,如果得奖者排在得奖者名单的第25位,那么得奖者会增加10,如果得奖者排在第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)  

我只能说这些了。我希望你能跟我走。你知道吗

相关问题 更多 >