Python:迭代列表中的真假变量,结果不同

Posted

技术标签:

【中文标题】Python:迭代列表中的真假变量,结果不同【英文标题】:Python: iterate over true and false variables in a list, with different outcomes 【发布时间】:2018-01-14 05:26:56 【问题描述】:

我正在编写一个类似 yahtzee 的游戏,玩家掷 5 个骰子,然后选择要重新掷的骰子。

我无法让我的函数正确地遍历用户输入以验证它们是否有效。

这里有一些代码:

def diceroll():
    raw_input("Press enter to roll dice: ")
    a = random.randint(1, 6)
    b = random.randint(1, 6)
    c = random.randint(1, 6)
    d = random.randint(1, 6)
    e = random.randint(1, 6)
    myroll.append(a)
    myroll.append(b)
    myroll.append(c)
    myroll.append(d)
    myroll.append(e)
    print "Your roll:"
    print myroll
    diceSelect()

def diceSelect():
    s = raw_input("Enter the numbers of the dice you'd like to roll again, separated by spaces, then press ENTER: ")    
    rollAgain = map(int, s.split())
    updateMyRoll(rollAgain)

def updateMyRoll(a):
    reroll = []
    for n in a:
        if n in myroll:
            reroll.append(n)
            removeCommonElements(myroll, a)
            print "deleting elements..."
        elif n not in myroll:
            print "I don't think you rolled", n, "."
            diceSelect()
        else:
            print "I don't understand..."
            diceSelect()
        print "Your remaining dice: ", myroll

def removeCommonElements(a,b,):
for e in a[:]:
    if e in b:
        a.remove(e)
        b.remove(e)

问题可能出在 diceSelect 函数中,因此我只能输入真值并且工作正常,我只能输入假值并仅获得第一个假值的预期效果(我根据代码理解) ...但想更改),或者我可以输入真值和假值,但它只作用于真值而忽略假值。

如何遍历这些值并重新提示用户输入所有真实值?

【问题讨论】:

什么是“想要的效果”? @Carcigenicate 我很抱歉不清楚,我会更新原帖。我希望它验证用户中的所有值是否与原始 5 个骰子中实际掷出的值相匹配。如果不是,我希望它返回提示他们输入有效值。这是当我只输入错误值时发生的行为,但是,它只会告诉用户“我认为你没有为输入的第一个错误值滚动 x”。 你有什么理由用 Python2 学习 Python 吗?这些天你应该使用 Python3 @WayneWerner 我想我应该切换到 Python3;我被称为“Learn Python the Hard Way”,我发现它使用了 Python2。但我想为 Python3 买一本新书。我欢迎任何关于好资源的建议。与 LPTHW 相比,我更喜欢结构,但亲自动手也很好。 是的,使用 Python2 是那本书的many problems 之一。我们有一个nice list of better resources 【参考方案1】:

您的代码中有几个问题。我已经重写了你的代码:

def diceroll(dice_count=6):
    raw_input("Press enter to roll dice: ")
    # No need to create a variable for each roll.
    # Also modifying global variables is a bad idea
    rolls = []
    for _ in range(dice_count-1):
        rolls.append(random.randint(1,6))
    # or **instead** of the above three lines, a list
    # comprehension
    rolls = [random.randint(1,6) for _ in range(dice_count-1)]
    return rolls

def roll_select():
    # one letter variable names are hard to follow
    choices = raw_input("Enter the numbers of the dice you'd like to roll again, separated by spaces, then press ENTER: ")    
    # again, modifying global variables is a bad idea
    # so return the selection
    return map(int, choices.split())

def roll_new_dice(myroll):
    # no need to create a new list, we have everything
    # we need right here
    for val in roll_select():
        try:
            print('deleting '.format(val))
            # we can just remove the values directly. We'll get
            # an exception if they're not in the list.
            myroll.remove(val)
        except ValueError:
            print("That wasn't one of your rolls")
    # Then we can re-use our function - this time
    # extending our list.
    myroll.extend(diceroll(6-len(myroll)))

rolls = diceroll()
print('You rolled '.format(rolls))
changes = roll_select()
if changes:
    roll_new_dice(rolls)
print('Your new rolls: '.format(rolls))

希望这应该比你以前的更清楚。

【讨论】:

非常感谢,这远远超出了我的要求。我现在正在安装 Python3 并正在过渡。我正在查看为学习 Python3 发布的一些资源;我不介意买一本综合性的书。官方 Python3 教程很好,但对于像我这样的人来说不是一个很好的起点,但看起来适合在我进步的过程中查找主题。

以上是关于Python:迭代列表中的真假变量,结果不同的主要内容,如果未能解决你的问题,请参考以下文章

根据 for 循环中的迭代次数向列表添加不同的值

Python:迭代具有不同维度的列表,是不是有通用方法?

在 Python 中结合两种不同的可迭代类型

python3中的range函数返回的是列表吗?

python 列表切片赋值

迭代python中的不同函数