[Tutor] Python code trouble!
Dave Angel
d at davea.name
Tue Nov 22 01:44:49 CET 2011
On 11/21/2011 06:57 PM, Steven D'Aprano wrote:
> Hello John,
>
>
> You are still posting from the future. Please fix your computer so
> that it is no longer set 12 hours in the future. Or perhaps your
> computer is just set in the wrong time zone.
>
>
> John wrote:
>> Hi all,
>>
>> I have attempted to create a programme which removes every Nth person
>> from the list until there is only one name remaining. N is inputted
>> by the user.
>
> Ah, the Josephus problem! Trickier than it seems.
>
> http://en.wikipedia.org/wiki/Josephus_permutation
>
>
>> Here is the code:
>>
>> def survivor(names, step):
>> next = names
>
> This line is pointless. It just assigns a new name to the same list.
> Why not just work directly with "names" instead of the misleading
> "next"? (Next what?)
>
>> while len(next) > 1:
>> index = step - 1
>> next.remove (next[index])
>
> This does not do what you think it does, but even when it does, it
> doesn't it slowly and inefficiently.
>
> You start of with an index. You want to delete the item at that index.
> So you start by retrieving the item at that index, then instruct the
> list to search from the beginning of the list for something which
> matches, then delete that. So consider what happens if you have a
> really huge list, with tens of thousands of items, and ask to delete
> the last one: even though you know you want to delete the last item,
> the remove() method has to check every single item first.
>
> Worse, what if there are duplicates? The *first* duplicate found will
> be removed, instead of the one at the given index.
>
> If you want to delete the name at an index, you should just directly
> delete the name at the index:
>
> del names[index]
>
>
>> index = index + step - 1
>
> This line is wrong. It means that you take one fewer step each time
> than you expect. For instance, if you take step = 4, you should step
> along indexes 3, 3+4=7, 7+4=11, 11+4=15, ... but instead you step
> along indexes 3, 3+4-1=6, 6+4-1=9, 9+4-1=12, ...
Actually, this one is the one he got right. Since he just deleted an
item from the list, he should base the step off one *before* the present
one.
index = (index-1) + step
>
>
>> while index > len(next):
>> index = index - len(next)
>> if index == len(next):
>> index = 0
>
> You can combine both of those with a single test:
>
> while index >= len(names):
> index = index - len(names)
>
He could simplify that using the modulo operator.
>
>> return names[0]
>>
>>
I'm not familiar with the Josephus problem, and I don't have time right
now to research it. So I can't help with the rest.
--
DaveA
More information about the Tutor
mailing list