我有一个代码,可以在这个场景中从名单列表中确定幸存者,列表中的最后一个人幸存下来 我的代码是:
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为格雷格,2为安德鲁。
我为此尝试的代码是:
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
但是会返回
['Brenda','Craig','Deidre','Edward','Felicity','Greg','Harriet']
['Craig','Deidre','Edward','Felicity','Greg','Harriet']
<'>''Deidre','Edward','Felicity','Greg','Harriet']['Edward','Felicity','Greg','Harriet']
['Felicity','Greg','Harriet']
['Greg','Harriet']
[ '哈丽特']
这不是我想要的
任何人都可以帮我解决这个问题吗?
答案 0 :(得分: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)
会起作用,但您也可以使用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
注意:我不知道为什么那里有None
...但你提供的例子确实匹配了!
答案 1 :(得分:1)
for step in survivor(names, step):
注意您在这里两次使用step
的方式。如何将Python传递给survivor
函数,然后才能将它从函数中删除?
我认为你想要的是range
function。这将遍历从1到名称列表长度的每个step
值:
for step in range(1, len(names)):
您的itertools.count
版本也应该可以使用,现在我考虑一下。您是在检查此功能的返回值还是仅查看打印出来的内容?输出看起来像这一行:
print names
另一件事是,您的功能会在每次运行时更改原始列表,因为您更改了names
并且您没有复制。也许你想在更改前复制一份:
def survivor(names, step):
names = names[:]
# etc
请参阅this question了解names[:]
创建列表副本的原因。