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
Just make variables an iterator/list whatever of integers then. Here I just set it via range, but it could be set any way.

from itertools import product
from more_itertools import grouper
import string

# create the "data"
number_pairs = 3
variables = list(range(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 [0, 1, 2, 3, 4, 5] [(0, 2, 4), (0, 2, 5), (0, 3, 4), (0, 3, 5), (1, 2, 4), (1, 2, 5), (1, 3, 4), (1, 3, 5)]
(Jan-27-2021, 06:03 PM)bowlofred Wrote: [ -> ]Just make variables an iterator/list whatever of integers then. Here I just set it via range, but it could be set any way.

from itertools import product
from more_itertools import grouper
import string

# create the "data"
number_pairs = 3
variables = list(range(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 [0, 1, 2, 3, 4, 5] [(0, 2, 4), (0, 2, 5), (0, 3, 4), (0, 3, 5), (1, 2, 4), (1, 2, 5), (1, 3, 4), (1, 3, 5)]

I apologise, probably it is my fault that I cannot tell what I want exactly but NO! my variables are not 0 2 4 my variables must be that
for variables in itertools.product([0, 1], repeat=(number*2))
After that I should create this groups
And after that I am writing what you recommand:
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,c,cp= variables[0],variables[1],variables[2],hvariables[3] #giving value for a,ap,b,bp,c,cp
    #nlist = [(a,b),(a,bp),(ap,b),(ap,bp)] #binary combination of a,ap,b,bp,c,cp
    groups = grouper(variables, 2)
    finallist = product(*groups)
    print(list(finallist))
And I am getting this error:
Error:
raceback (most recent call last): File "free.py", line 151, in <module> groups = grouper(variables, 2) File "/usr/lib/python3/dist-packages/more_itertools/recipes.py", line 295, in grouper args = [iter(iterable)] * n TypeError: 'int' object is not iterable
My variable is already a list !!! Why am I gettigng this error?

P.S I also wrote: variable = list(variable) but still it did not work
My variables was just a single list. I'm not completely sure, but maybe you want to run it for each of the groups in your product? Like this?

from itertools import product
from more_itertools import grouper
import string

# create the "data"
number = 2
for variables in product([0, 1], repeat=(number*2)):
    print(f"Running for variables = {variables}")

    groups = grouper(variables, 2)
    finallist = product(*groups)
    print(list(finallist))
Output:
Running for variables = (0, 0, 0, 0) [(0, 0), (0, 0), (0, 0), (0, 0)] Running for variables = (0, 0, 0, 1) [(0, 0), (0, 1), (0, 0), (0, 1)] Running for variables = (0, 0, 1, 0) [(0, 1), (0, 0), (0, 1), (0, 0)] Running for variables = (0, 0, 1, 1) [(0, 1), (0, 1), (0, 1), (0, 1)] ...
(Jan-27-2021, 07:54 PM)bowlofred Wrote: [ -> ]My variables was just a single list. I'm not completely sure, but maybe you want to run it for each of the groups in your product? Like this?

from itertools import product
from more_itertools import grouper
import string

# create the "data"
number = 2
for variables in product([0, 1], repeat=(number*2)):
    print(f"Running for variables = {variables}")

    groups = grouper(variables, 2)
    finallist = product(*groups)
    print(list(finallist))
Output:
Running for variables = (0, 0, 0, 0) [(0, 0), (0, 0), (0, 0), (0, 0)] Running for variables = (0, 0, 0, 1) [(0, 0), (0, 1), (0, 0), (0, 1)] Running for variables = (0, 0, 1, 0) [(0, 1), (0, 0), (0, 1), (0, 0)] Running for variables = (0, 0, 1, 1) [(0, 1), (0, 1), (0, 1), (0, 1)] ...
Exactly but still I have the same error??
Error:
groups = more_itertools.grouper(variables, 2) File "/usr/lib/python3/dist-packages/more_itertools/recipes.py", line 295, in grouper args = [iter(iterable)] * n TypeError: 'int' object is not iterable
This is working for you but not working for me. This is quite interesting!
Show the entire code (including imports). Your code seems to work for me....

import itertools
import more_itertools

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,c,cp= variables[0],variables[1],variables[2],hvariables[3] #giving value for a,ap,b,bp,c,cp
    #nlist = [(a,b),(a,bp),(ap,b),(ap,bp)] #binary combination of a,ap,b,bp,c,cp
    groups = more_itertools.grouper(variables, 2)
    finallist = itertools.product(*groups)
    print(list(finallist))
Output:
[(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)]
(Jan-27-2021, 08:38 PM)bowlofred Wrote: [ -> ]Show the entire code (including imports). Your code seems to work for me....

import itertools
import more_itertools

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,c,cp= variables[0],variables[1],variables[2],hvariables[3] #giving value for a,ap,b,bp,c,cp
    #nlist = [(a,b),(a,bp),(ap,b),(ap,bp)] #binary combination of a,ap,b,bp,c,cp
    groups = more_itertools.grouper(variables, 2)
    finallist = itertools.product(*groups)
    print(list(finallist))
Output:
[(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)]

Quite interesting.. since morning I am trying the make it works but no. Here is the my code:

from typing import Union, Sequence, Tuple, Any
import itertools
import cirq
import numpy as np
import random
import string
from collections import defaultdict
import csv
import pprint
import fileinput
import cvxpy 
from cirq.type_workarounds import NotImplementedType
import collections
import more_itertools

...
for variables in itertools.product([0, 1], repeat=(number*2)): # set of deterministic hidden variables for a,ap,b,bp,c,cp like 000000 000001 000011....
    print(f"Running for variables = {variables}")
    groups_ = more_itertools.grouper(variables, 2)
    finallist = itertools.product(*groups_)
    print(list(finallist))
...
I am using ubuntu and I installed more_itertools like that: sudo apt install python3-more-itertools. And the error is that:
Error:
Traceback (most recent call last): File "free.py", line 150, in <module> groups_ = more_itertools.grouper(variables, 2) File "/usr/lib/python3/dist-packages/more_itertools/recipes.py", line 295, in grouper args = [iter(iterable)] * n TypeError: 'int' object is not iterable
Ah ok!

indexess will change their order:
Instead of following line
    groups_ = more_itertools.grouper(variables, 2)
we should write that:

    groups_ = more_itertools.grouper(2,variables)
Very interesting. Is that a different package? I'm not on ubuntu, so just installed via pip.

For this package, the iterable is the first argument.

>>> import inspect
>>> import more_itertools
>>> inspect.signature(more_itertools.grouper)
<Signature (iterable, n, fillvalue=None)>
(Jan-27-2021, 10:05 PM)bowlofred Wrote: [ -> ]Very interesting. Is that a different package? I'm not on ubuntu, so just installed via pip.

For this package, the iterable is the first argument.

>>> import inspect
>>> import more_itertools
>>> inspect.signature(more_itertools.grouper)
<Signature (iterable, n, fillvalue=None)>
I did not check the version explicitly but yeah it made me very angry. Luckily I found. Btw I found from documents ... Maybe they just updated ...
I was interested. According to github, the original description of this function (in the python itertools recipe docs) was with n as the first argument.

The package was created in 2012, the docs "fixed" the signature so the iterator was the first argument in 2013, and then nobody noticed or fixed it in the package until 2019. So the old signature is in more_itertools up through 5.0.0 and the new one since 6.0.0. Looks like the ubuntu package installs 4.2.0 with the "old" signature.
Pages: 1 2