Python Forum

Full Version: Group List Elements according to the Input with the order of binary combination
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Pages: 1 2
Hello,
I have this code scripts:
for variables in itertools.product([0, 1], repeat=(number*2)): # set of  variables for a,ap,b,bp,c,cp like 000000 000001 000011....
    #a,ap,b,bp,c,cp= variables[0],variables[1],variables[2],variables[3],variables[4],variables[5] #giving value for a,ap,b,bp,c,cp
    a,ap,b,bp= variables[0],variables[1],variables[2],variables[3]
    finallist = [(a,b),(a,bp),(ap,b),(ap,bp)] #binary combination of a,ap,b,bp,c,cp
    #finallist = [i for i in range(hidden_variables)]
    #finallist = [(a,b,c),(a,b,cp),(a,bp,c),(a,bp,cp),(ap,b,c),(ap,b,cp),(ap,bp,c),(ap,bp,cp)]
I know that "variables" is already an array but after that I want to group this list according to value of "number" instead of writing by hand . For example if "number" is 2, then list will have that: finallist = [(a,b),(a,bp),(ap,b),(ap,bp)] or if "number" is 3, the list will have that: finallist = [(a,b,c),(a,b,cp),(a,bp,c),(a,bp,cp),(ap,b,c),(ap,b,cp),(ap,bp,c),(ap,bp,cp)].In this code, first I am separating variables as a ap b bp.. and after that I am making binary combination according to "number". Instead of making this step by hand, I thought maybe it could be possible to do it dynamically and I wrote the following code script but it did not give the reult that I want:
subList = [variables[n:n+number] for n in range(0, len(variables*2), number)]
However it did not work!

For clarification:

This is my code for number 2:

number = 2
for variables in itertools.product([0, 1], repeat=(number*2)): # set of  variables for a,ap,b,bp,c,cp like 000000 000001 000011....
    a,ap,b,bp= variables[0],variables[1],variables[2],variables[3]
    finallist = [(a,b),(a,bp),(ap,b),(ap,bp)] 
THis is my code for number 3

number = 3
for variables in itertools.product([0, 1], repeat=(number*2)): # set of  variables for a,ap,b,bp,c,cp like 000000 000001 000011....
    a,ap,b,bp,c,cp= variables[0],variables[1],variables[2],variables[3],variables[4],variables[5] #giving value for a,ap,b,bp,c,cp
    finallist = [(a,b,c),(a,b,cp),(a,bp,c),(a,bp,cp),(ap,b,c),(ap,b,cp),(ap,bp,c),(ap,bp,cp)]
THis is my code for number =4

number = 4
for variables in itertools.product([0, 1], repeat=(number*2)): # set of  variables for a,ap,b,bp,c,cp like 000000 000001 000011....
    a,ap,b,bp,c,cp,d,dp= variables[0],variables[1],variables[2],variables[3],variables[4],variables[5] ,variables[6],variables[7]#giving value for a,ap,b,bp,c,cp
    finallist = [(a,b,c,d),(a,b,c,dp),(a,b,cp,d),....]#I am not writing 
And I am looking for a way to create finallist dynamically
Quote:However it did not work!
Please elaborate and post any error messages ( complete and unaltered in error tags )
(Jan-26-2021, 10:19 PM)Larz60+ Wrote: [ -> ]
Quote:However it did not work!
Please elaborate and post any error messages ( complete and unaltered in error tags )

I should get this result(and with old method I can get this result)
[(0, 0), (0, 0), (0, 0), (0, 0)]
[(0, 0), (0, 1), (0, 0), (0, 1)]
[(0, 1), (0, 0), (0, 1), (0, 0)]
[(0, 1), (0, 1), (0, 1), (0, 1)]
[(0, 0), (0, 0), (1, 0), (1, 0)]
[(0, 0), (0, 1), (1, 0), (1, 1)]
[(0, 1), (0, 0), (1, 1), (1, 0)]
[(0, 1), (0, 1), (1, 1), (1, 1)]
[(1, 0), (1, 0), (0, 0), (0, 0)]
[(1, 0), (1, 1), (0, 0), (0, 1)]
[(1, 1), (1, 0), (0, 1), (0, 0)]
[(1, 1), (1, 1), (0, 1), (0, 1)]
[(1, 0), (1, 0), (1, 0), (1, 0)]
[(1, 0), (1, 1), (1, 0), (1, 1)]
[(1, 1), (1, 0), (1, 1), (1, 0)]
[(1, 1), (1, 1), (1, 1), (1, 1)]
However when I try to do this code, dynamically(with subList script), I am getting this result:
[(0, 0), (0, 0), (), ()]
[(0, 0), (0, 1), (), ()]
[(0, 0), (1, 0), (), ()]
[(0, 0), (1, 1), (), ()]
[(0, 1), (0, 0), (), ()]
[(0, 1), (0, 1), (), ()]
[(0, 1), (1, 0), (), ()]
[(0, 1), (1, 1), (), ()]
[(1, 0), (0, 0), (), ()]
[(1, 0), (0, 1), (), ()]
[(1, 0), (1, 0), (), ()]
[(1, 0), (1, 1), (), ()]
[(1, 1), (0, 0), (), ()]
[(1, 1), (0, 1), (), ()]
[(1, 1), (1, 0), (), ()]
[(1, 1), (1, 1), (), ()]
To achieve list as you present, what are the values for number?
(Jan-27-2021, 02:36 AM)Larz60+ Wrote: [ -> ]To achieve list as you present, what are the values for number?
Number (for these values ) is an integer and its value is 2 for list that I presented above. So I have 4 variable(number*2) and I will have pair binary combinations of these 4 variables (a,b),(a,bp),(ap,b),(ap,bp)

If number would be 3, this time I would have 6 variable and as a list I would have the triple binary combination of these 6 variables : (a,b,c),(a,b,cp),(a,bp,c),(a,bp,cp),(ap,b,c),(ap,b,cp),(ap,bp,c),(ap,bp,cp)
I'm not sure where the variables are coming from, but you can pass them into itertools.product to get the list that you want from them.

>>> from itertools import product
>>> list(product(("a","ap"), ("b", "bp"), ("c", "cp")))
[('a', 'b', 'c'), ('a', 'b', 'cp'), ('a', 'bp', 'c'), ('a', 'bp', 'cp'), ('ap', 'b', 'c'), ('ap', 'b', 'cp'), ('ap', 'bp', 'c'), ('ap', 'bp', 'cp')]
This is the problem already. I do not want to write these variables by hand!
Probably I could not explain my problem to you

I just want to do these 2 line dynamically:

a,ap,b,bp= variables[0],variables[1],variables[2],variables[3]
finallist = [(a,b),(a,bp),(ap,b),(ap,bp)] 
These a ap b bp are coming from this line

for variables in itertools.product([0, 1], repeat=(number*2)): # set of  variables for a,ap,b,bp,c,cp like 000000 000001 000011....
"variables" includes actually a ap b bp...

Ok I am writing from the beginning
This is my code for number 2:

number = 2
for variables in itertools.product([0, 1], repeat=(number*2)): # set of  variables for a,ap,b,bp,c,cp like 000000 000001 000011....
    a,ap,b,bp= variables[0],variables[1],variables[2],variables[3]
    finallist = [(a,b),(a,bp),(ap,b),(ap,bp)] 
THis is my code for number 3

number = 3
for variables in itertools.product([0, 1], repeat=(number*2)): # set of  variables for a,ap,b,bp,c,cp like 000000 000001 000011....
    a,ap,b,bp,c,cp= variables[0],variables[1],variables[2],variables[3],variables[4],variables[5] #giving value for a,ap,b,bp,c,cp
    finallist = [(a,b,c),(a,b,cp),(a,bp,c),(a,bp,cp),(ap,b,c),(ap,b,cp),(ap,bp,c),(ap,bp,cp)]
THis is my code for number =4

number = 4
for variables in itertools.product([0, 1], repeat=(number*2)): # set of  variables for a,ap,b,bp,c,cp like 000000 000001 000011....
    a,ap,b,bp,c,cp,d,dp= variables[0],variables[1],variables[2],variables[3],variables[4],variables[5] ,variables[6],variables[7]#giving value for a,ap,b,bp,c,cp
    finallist = [(a,b,c,d),(a,b,c,dp),(a,b,cp,d),....]#I am not writing 
And I am looking for a way to create finallist dynamically
Your information is already stored in the list variables. I wouldn't move the data to other names.

Maybe something like this?
from itertools import product
from more_itertools import grouper
import string

# create the "data"
number_pairs = 3
variables = list(string.ascii_uppercase[:number_pairs * 2])
print(f"variables data starts as {variables}")

number = len(variables)

groups = grouper(variables, 2)
finallist = product(*groups)
print(list(finallist))
Output:
variables data starts as ['A', 'B', 'C', 'D', 'E', 'F'] [('A', 'C', 'E'), ('A', 'C', 'F'), ('A', 'D', 'E'), ('A', 'D', 'F'), ('B', 'C', 'E'), ('B', 'C', 'F'), ('B', 'D', 'E'), ('B', 'D', 'F')]
Change number_pairs make a bigger list, and the the product is created from whatever is in the list.
(Jan-27-2021, 04:40 PM)bowlofred Wrote: [ -> ]Your information is already stored in the list variables. I wouldn't move the data to other names.

Maybe something like this?
from itertools import product
from more_itertools import grouper
import string

# create the "data"
number_pairs = 3
variables = [x for x in string.ascii_uppercase[:number_pairs * 2]]
print(f"variables data starts as {variables}")

number = len(variables)

groups = grouper(variables, 2)
finallist = product(*groups)
print(list(finallist))
Output:
variables data starts as ['A', 'B', 'C', 'D', 'E', 'F'] [('A', 'C', 'E'), ('A', 'C', 'F'), ('A', 'D', 'E'), ('A', 'D', 'F'), ('B', 'C', 'E'), ('B', 'C', 'F'), ('B', 'D', 'E'), ('B', 'D', 'F')]
Change number_pairs make a bigger list, and the the product is created from whatever is in the list.

My variables are not string. They are integer! So I changed the code anf it did not worked!
for variables in itertools.product([0, 1], repeat=(number*2)): # set of  variables for a,ap,b,bp,c,cp like 000000 000001 000011....
    groups = grouper(variables, 2)
    finallist2 =list( product(*groups))
    print(finallist2)
I got this error

Error:
TypeError: 'int' object is not iterable
What's the full error? What is the error telling you is an int instead of an iterable?
Pages: 1 2