[Tutor] Deleted dictionary length not reporting

Dave Angel davea at davea.name
Wed Jul 17 04:12:39 CEST 2013


On 07/16/2013 09:48 PM, Jim Mooney wrote:
> This is puzzling me. I have a folder with about 125 movie sound clips,
> like "I'll be back," blues brothers theme, oompa-loompas, etc. I play
> seven random ones on windows startup, which works fine. But just so I
> don't repeat a clip, I delete it from the dictionary on each go-round.
> However, to make sure that happened, I printed the key-length on each
> go-round.  It should be shorter by one every time but I always get a
> length of 125. (Yes, I know there are about five different ways to do
> this, but I thought I'd try a dictionary ;')
>
> Also, the printout doesn't occur until after all the sounds play, so
> maybe that has something to do with it. But I also tried saving the
> lengths in a list while the program ran, and got the same result. A
> list of all '125'
>
> #Using Python 2.7 on Win 7
>
> import winsound
> import random, os
> random.seed()
>
> lenlist = []
> file_list = os.listdir('WAV')
>
> for clip in range(0,7):
>      file_dict = dict(enumerate(file_list))
>      sound_key = random.choice(range(0,len(file_list)))
>      winsound.PlaySound('WAV/' + file_dict[sound_key], winsound.SND_FILENAME)
>      del file_dict[sound_key]

You're deleting something from a dictionary that you're going to 
recreate next time through the loop.  If you really want to delete it, 
remove it from the file_list.  Your dictionary is accomplishing 
precisely nothing anyway, since file_dict[key] will give you the same 
value as file_list[key].

But if you like the dictionary, then create it outside the loop.  Now 
deleting things from it will actually mean something.  Of course, then 
your random.choice() will have to be over the dictionary, not over the 
list.  Or you'll have to handle the case where it happens to choose the 
same item again, with a loop inside the loop to handle those retries...


>      print(len(file_dict.keys()))

Seems to me the obvious choice is just to use random.choice of the 
enumerated file list, then delete the item from the list.  Way too much 
indirection in the code above.


-- 
DaveA



More information about the Tutor mailing list