On 09/05/2010 03:48 PM, Evert Rol wrote:
On 5 Sep 2010, at 22:31 , Micheal Beatty wrote:

On 09/05/2010 03:16 PM, Evert Rol wrote:
I'm having a little problem figuring out how to accomplish this simple task. 
I'd like to take a list of 6 numbers and add every permutation of those numbers 
in groups of four. For example for 1, 2, 3, 4, 5, 6 add 1 + 1 + 1 +1 then 1 + 1 
+ 1 +2 etc. until reaching 6 + 6 + 6 + 6. Using a for loop, that was the easy 
part, now I'd like to take the results and count the number of times each 
number occurs.
My problem occurs when I try to create a list from the results of the for loop, 
it puts each individual number into its own list. I've looked everywhere for 
the solution to this and can find nothing to help.
<snip />

  here is the code.
fourdsix = [1, 2, 3, 4, 5, 6]
for i in fourdsix:
    for j in fourdsix:
        for k in fourdsix:
            for l in fourdsix:
                fourdsix_result = [i, j, k, l]
                attribs = sum(fourdsix_result) - min(fourdsix_result)
                print attribs

This gives me the proper results,
I'm not sure I understand that, because now you have a subtraction here; not 
sure what that does.
It removes the lowest number in the group of 4. It's intended to replicate 
rolling four six sided dice, eliminating the lowest number and adding the 
remaining 3 dice roll results. I didn't mention it cause I felt it wasn't 
germane to the problem and it might needlessly complicate the situation.
<snip />

attrib_list = []
attrib_list.append(attribs)
print attrib_list
This one should work, unless you've put it incorrectly inside the code. But 
otherwise, it will create the list you're looking for.
So then it's a matter of stepping through the numbers inside the list and 
counting their occurrences.
I've tried this in every place in the code, outside the loop, inside at each 
step of the loop and none of them get me what I want. Andre's suggestion that I 
put the empty list before the loop helped but it's still giving me multiple 
lists.
Can you send what you currently have? Sounds like you still have the first 
statement at some incorrect place in your code.


Here is what I have.

# Program to determine frequency of each possible 4d6 die roll

attrib_list = []
fourdsix = [1, 2, 3, 4, 5, 6] #list of possible 1d6 die roll  results
for i in fourdsix:
    for j in fourdsix:
        for k in fourdsix:
            for l in fourdsix:
                fourdsix_result = [i, j, k, l] # creating list from loop results
                attribs = sum(fourdsix_result) - min(fourdsix_result)
                attrib_list.append(attribs)
                print attrib_list


This gets me multiple lists running through the loop.
Have you tried printing attrib_list at the very end of your code, *outside* all 
the nested loops?

*facepalm*

D'oh that worked. I tried every other combination of placing the attrib_list commands except putting the print statement outside the loop by itself.

Thanks for finding that.


I also noticed a mistake in a previous answer:

map(sum, combinations_with_replacement(range(1,7), 4))
doesn't really work, because it produces eg [1, 1, 1, 2], but skips [2, 1, 1, 1], 
[1, 2, 1, 1]&  [1, 1, 2, 1].

itertools.product does produce all of these combinations (and the docs even say 
"Equivalent to nested for-loops in a generator expression." for product()).
Of course, when you want to throw away the lowest number, it becomes something 
like:

map(lambda x: sum(x)-min(x), itertools.product(range(1,7), repeat=4))
(list with 1296 elements)

Just for future reference.
I understand some of that but most of it is a little advanced for me right now. :-)

Thanks very much for your help.

mwb


_______________________________________________
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor

Reply via email to