python - 使用 itertools 进行格雷码顺序的笛卡尔积?

标签 python product python-itertools gray-code

有没有类似Python的itertools.product()的东西它提供了一组按格雷码顺序的笛卡尔积的迭代?例如,假设存在这样一个假设的生成器,它被称为 gray_code_product() ,然后gray_code_product(['a','b','c'], [0,1], ['x','y'])将按顺序生成:

('a',0,'x')
('a',0,'y')
('a',1,'y')
('a',1,'x')
('b',1,'x')
('b',1,'y')
('b',0,'y')
('b',0,'x')
('c',0,'x')
('c',0,'y')
('c',1,'y')
('c',1,'x')

最佳答案

根据documentation itertools.product 的函数相当于以下 Python 代码:

def product(*args, repeat=1):
    pools = [tuple(pool) for pool in args] * repeat
    result = [[]]
    for pool in pools:
        result = [x+[y] for x in result for y in pool]
    for prod in result:
        yield tuple(prod)

由于格雷码产品是关于反转每个池的前面序列的顺序,因此您可以在迭代它以确定之前的 result 列表时使用 enumerate 来确定如果索引是奇数或偶数,如果是奇数则反转池的顺序:

def gray_code_product(*args, repeat=1):
    pools = [tuple(pool) for pool in args] * repeat
    result = [[]]
    for pool in pools:
        result = [x+[y] for i, x in enumerate(result) for y in (
            reversed(pool) if i % 2 else pool)]
    for prod in result:
        yield tuple(prod)

这样:

for p in gray_code_product(['a','b','c'], [0,1], ['x','y']):
    print(p)

输出:

('a', 0, 'x')
('a', 0, 'y')
('a', 1, 'y')
('a', 1, 'x')
('b', 1, 'x')
('b', 1, 'y')
('b', 0, 'y')
('b', 0, 'x')
('c', 0, 'x')
('c', 0, 'y')
('c', 1, 'y')
('c', 1, 'x')

关于python - 使用 itertools 进行格雷码顺序的笛卡尔积?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61149569/

相关文章:

python - Django 的 NotImplementedError : aggregate() + distinct(fields) not implemented

php - 以编程方式更新 WooCommerce 产品中设置的自定义属性值

Magento 使用 addVisibleInCatalogFilterToCollection 不返回任何内容

python itertools 产品慢是输出文件的写入速度的瓶颈

python - 是否有替代 python 生成器输入排列的方法?

python - 如何停止重定向移动请求 Nginx Flask?

python - 模块未找到错误: No module named 'gspread'

php - 根据购物车页面中的属性值和产品数量在 WooCommerce 中添加到购物车验证

numpy - 涉及非常大的数组的问题

python - 文件更改事件网络共享