使用 itertools 或 numpy 的分类排列
Classified permutations using itertools or numpy
我有一系列可以取离散值的维度。
例如,假设我有 4 个维度,每个维度都包含来自维度特定列表的关键字:
color: black, blue, red, green, yellow
size: xs, s, m, l, xl
material: leather, fabric, cotton, wool
gender: male, female
我想通过这些维度值的所有可能组合进行迭代并做一些事情。
假设有两种不同的情况,有没有办法用 itertools
或 numpy
做到这一点?
- 如果每个维度只能有一个关键字
- 如果每个维度可以有一个或多个关键字
你试过itertools.product(*iterables)
了吗?听起来这就是你要找的东西。
该函数需要任意多的可迭代对象并生成笛卡尔积。这是一个例子:
import itertools
dimension1 = range(3)
dimension2 = ['a']
dimension3 = ['hello', 'world']
for res in itertools.product(dimension1, dimension2, dimension3):
print(*res)
输出:
0 a hello
0 a world
1 a hello
1 a world
2 a hello
2 a world
Is there a way to do this with itertools or numpy assuming two different cases?
from itertools import product
gender = ['male', 'female']
color = ['black', 'blue', 'red', 'green', 'yellow']
material = ['leather', 'fabric', 'cotton', 'wool']
size = ['xs', 's','m', 'l', 'xl']
for item in product(color, size, material, gender):
#do something()
您也可以使用 generator expressions
for item in ((g, c, m, s) for g in gender for c in color for m in material for s in size):
#do something()
输出
>>> for item in ((g, c, m, s) for g in gender for c in color for m in material for s in size):
... print(item)
...
('male', 'black', 'leather', 'xs')
('male', 'black', 'leather', 's')
('male', 'black', 'leather', 'm')
('male', 'black', 'leather', 'l')
('male', 'black', 'leather', 'xl')
('male', 'black', 'fabric', 'xs')
('male', 'black', 'fabric', 's')
('male', 'black', 'fabric', 'm')
('male', 'black', 'fabric', 'l')
('male', 'black', 'fabric', 'xl')
('male', 'black', 'cotton', 'xs')
('male', 'black', 'cotton', 's')
('male', 'black', 'cotton', 'm')
('male', 'black', 'cotton', 'l')
('male', 'black', 'cotton', 'xl')
('male', 'black', 'wool', 'xs')
('male', 'black', 'wool', 's')
('male', 'black', 'wool', 'm')
('male', 'black', 'wool', 'l')
('male', 'black', 'wool', 'xl')
('male', 'blue', 'leather', 'xs')
('male', 'blue', 'leather', 's')
('male', 'blue', 'leather', 'm')
('male', 'blue', 'leather', 'l')
('male', 'blue', 'leather', 'xl')
('male', 'blue', 'fabric', 'xs')
('male', 'blue', 'fabric', 's')
('male', 'blue', 'fabric', 'm')
('male', 'blue', 'fabric', 'l')
('male', 'blue', 'fabric', 'xl')
('male', 'blue', 'cotton', 'xs')
('male', 'blue', 'cotton', 's')
('male', 'blue', 'cotton', 'm')
('male', 'blue', 'cotton', 'l')
('male', 'blue', 'cotton', 'xl')
('male', 'blue', 'wool', 'xs')
('male', 'blue', 'wool', 's')
('male', 'blue', 'wool', 'm')
('male', 'blue', 'wool', 'l')
('male', 'blue', 'wool', 'xl')
('male', 'red', 'leather', 'xs')
('male', 'red', 'leather', 's')
('male', 'red', 'leather', 'm')
('male', 'red', 'leather', 'l')
('male', 'red', 'leather', 'xl')
('male', 'red', 'fabric', 'xs')
('male', 'red', 'fabric', 's')
('male', 'red', 'fabric', 'm')
('male', 'red', 'fabric', 'l')
('male', 'red', 'fabric', 'xl')
('male', 'red', 'cotton', 'xs')
('male', 'red', 'cotton', 's')
('male', 'red', 'cotton', 'm')
('male', 'red', 'cotton', 'l')
('male', 'red', 'cotton', 'xl')
('male', 'red', 'wool', 'xs')
('male', 'red', 'wool', 's')
('male', 'red', 'wool', 'm')
('male', 'red', 'wool', 'l')
...
- If each dimension can have only one keyword
- If each dimension can have one or several keywords
即使您的列表各有一个元素,这两种方法都可以使用。
我有一系列可以取离散值的维度。
例如,假设我有 4 个维度,每个维度都包含来自维度特定列表的关键字:
color: black, blue, red, green, yellow
size: xs, s, m, l, xl
material: leather, fabric, cotton, wool
gender: male, female
我想通过这些维度值的所有可能组合进行迭代并做一些事情。
假设有两种不同的情况,有没有办法用 itertools
或 numpy
做到这一点?
- 如果每个维度只能有一个关键字
- 如果每个维度可以有一个或多个关键字
你试过itertools.product(*iterables)
了吗?听起来这就是你要找的东西。
该函数需要任意多的可迭代对象并生成笛卡尔积。这是一个例子:
import itertools
dimension1 = range(3)
dimension2 = ['a']
dimension3 = ['hello', 'world']
for res in itertools.product(dimension1, dimension2, dimension3):
print(*res)
输出:
0 a hello
0 a world
1 a hello
1 a world
2 a hello
2 a world
Is there a way to do this with itertools or numpy assuming two different cases?
from itertools import product
gender = ['male', 'female']
color = ['black', 'blue', 'red', 'green', 'yellow']
material = ['leather', 'fabric', 'cotton', 'wool']
size = ['xs', 's','m', 'l', 'xl']
for item in product(color, size, material, gender):
#do something()
您也可以使用 generator expressions
for item in ((g, c, m, s) for g in gender for c in color for m in material for s in size):
#do something()
输出
>>> for item in ((g, c, m, s) for g in gender for c in color for m in material for s in size):
... print(item)
...
('male', 'black', 'leather', 'xs')
('male', 'black', 'leather', 's')
('male', 'black', 'leather', 'm')
('male', 'black', 'leather', 'l')
('male', 'black', 'leather', 'xl')
('male', 'black', 'fabric', 'xs')
('male', 'black', 'fabric', 's')
('male', 'black', 'fabric', 'm')
('male', 'black', 'fabric', 'l')
('male', 'black', 'fabric', 'xl')
('male', 'black', 'cotton', 'xs')
('male', 'black', 'cotton', 's')
('male', 'black', 'cotton', 'm')
('male', 'black', 'cotton', 'l')
('male', 'black', 'cotton', 'xl')
('male', 'black', 'wool', 'xs')
('male', 'black', 'wool', 's')
('male', 'black', 'wool', 'm')
('male', 'black', 'wool', 'l')
('male', 'black', 'wool', 'xl')
('male', 'blue', 'leather', 'xs')
('male', 'blue', 'leather', 's')
('male', 'blue', 'leather', 'm')
('male', 'blue', 'leather', 'l')
('male', 'blue', 'leather', 'xl')
('male', 'blue', 'fabric', 'xs')
('male', 'blue', 'fabric', 's')
('male', 'blue', 'fabric', 'm')
('male', 'blue', 'fabric', 'l')
('male', 'blue', 'fabric', 'xl')
('male', 'blue', 'cotton', 'xs')
('male', 'blue', 'cotton', 's')
('male', 'blue', 'cotton', 'm')
('male', 'blue', 'cotton', 'l')
('male', 'blue', 'cotton', 'xl')
('male', 'blue', 'wool', 'xs')
('male', 'blue', 'wool', 's')
('male', 'blue', 'wool', 'm')
('male', 'blue', 'wool', 'l')
('male', 'blue', 'wool', 'xl')
('male', 'red', 'leather', 'xs')
('male', 'red', 'leather', 's')
('male', 'red', 'leather', 'm')
('male', 'red', 'leather', 'l')
('male', 'red', 'leather', 'xl')
('male', 'red', 'fabric', 'xs')
('male', 'red', 'fabric', 's')
('male', 'red', 'fabric', 'm')
('male', 'red', 'fabric', 'l')
('male', 'red', 'fabric', 'xl')
('male', 'red', 'cotton', 'xs')
('male', 'red', 'cotton', 's')
('male', 'red', 'cotton', 'm')
('male', 'red', 'cotton', 'l')
('male', 'red', 'cotton', 'xl')
('male', 'red', 'wool', 'xs')
('male', 'red', 'wool', 's')
('male', 'red', 'wool', 'm')
('male', 'red', 'wool', 'l')
...
- If each dimension can have only one keyword
- If each dimension can have one or several keywords
即使您的列表各有一个元素,这两种方法都可以使用。