0

在这种情况下,我有一个代码可以从名称列表中确定幸存者以走木板,列表中的最后一个人幸存下来,我为此拥有的代码是:

names =  ["Andrew", "Brenda", "Craig", "Deidre", "Edward", "Felicity", "Greg", "Harriet"]
def survivor(names, step):
    Next = step - 1
    while len(names) > 1:
        names.pop(Next)
        Next = Next + step
        Next = (Next - 1) % len(names)
        print names

    return names[0]

这可以根据步骤中的内容返回幸存者,但我还需要为一个人的生存计算出最小的 N 步,例如 3 用于 greg 和 2 用于 Andrew。

我为此尝试过的代码是:

assert name in names
for step in survivor(names, step):
    if survivor == name:
        return step

但它一直说未定义分配或全局步骤之前引用的局部变量步骤。

assert name in names
for step in itertools.count(1):
    if survivor(names, step) == name:
        return step

但这会返回

[“布伦达”、“克雷格”、“迪德”、“爱德华”、“费利西蒂”、“格雷格”、“哈里特”]

['Craig'、'Deidre'、'Edward'、'Felicity'、'Greg'、'Harriet']

['Deidre'、'Edward'、'Felicity'、'Greg'、'Harriet']

['爱德华','费利西蒂','格雷格','哈里特']

['幸福','格雷格','哈里特']

['格雷格','哈里特']

['哈里特']

这不是我想要的

谁能帮我解决这个问题?

4

2 回答 2

2

这个循环不符合您的预期。你想要的应该是这样的:

def shortest(name):
    assert name in names
    for step in range(1, len(names)+1):
        #Go through all possible steps, from 1 to number of items (the +1 is to include the last item too)
        if survivor(names[:], step) == name: # Check that this item matches
            return step # Break out of the loop when you get to it

可以,itertools.count(1)但是您也可以使用 a while True,并且步长大于名称列表的长度是没有意义的。

您的问题可能是名称数组在名字之后变为空。因为您正在pop删除所有元素,并修改names全局范围内的列表(在函数之外定义)。所以你必须复制它(使用一个names[:]list(names)两个都可以达到相同的目的)。

这是我做的测试:

for n in names:
    print n, shortest(n)

和输出:

Andrew 2
Brenda None
Craig 5
Deidre 7
Edward None
Felicity 4
Greg 3
Harriet 1

注意:我不知道为什么里面有Nones ......但你给出的例子确实匹配!

于 2012-11-21T17:59:28.513 回答
1
for step in survivor(names, step):

注意你是如何在step这里使用两次的。Python 应该如何在将survivor其从该函数中取出之前将其传递给该函数?

你想要的是range功能。这将遍历step从 1 到名称列表长度的每个值:

for step in range(1, len(names)):

你的itertools.count版本也应该可以工作,现在我考虑了一下。你是在检查这个函数的返回值还是只看它打印出来的内容?输出看起来像是来自这一行:

print names

另一件事是您的函数每次运行时都会更改原始列表,因为您更改names了并且没有制作副本。也许您想在更改之前制作一个副本:

def survivor(names, step):
    names = names[:]
    # etc

请参阅此问题,了解为什么要names[:]创建列表的副本。

于 2012-11-21T17:33:23.047 回答