繁体   English   中英

python 3.6中任意数量参数的笛卡尔积

[英]Cartesian product of arbitrary number of arguments in python 3.6

我正在尝试编写一个Python 3.6命令行程序,该程序接受一个或多个列表作为参数,然后返回这些列表的笛卡尔积,可能采用重复数据删除形式。

我可以使用一个和两个列表参数正常工作,但是我无法弄清楚如何使程序正确处理三个或更多参数。

所需的输出是笛卡尔乘积,其中包括在命令行中作为参数传递的每个列表。

这是我到目前为止的代码:

def createArgumentParser():

    from argparse import ArgumentParser

    __parser = ArgumentParser()
    __parser.add_argument("list", type=list, nargs="+", help="List(s) to compute the cartesian product of")
    __parser.add_argument("-u", "--unique", action="store_true", help="Deduplicate lists so that they become sets of unique elements")
    __parser.add_argument("-U", "--Universally_unique", action="store_true", help="Deduplicate the resulting cartesian product so that the final result is a set of unique elements")
    return __parser.parse_args()


def cartesianProduct(__unique, __Universally_unique, *__list):

    from itertools import product

    __cartesianProduct = product([])

    if __unique:
        __cartesianProduct = product(sorted(set(__list[0])), sorted(set(__list[len(__list)-1])))
    else:
        __cartesianProduct = product(__list[0], __list[len(__list)-1])
    if __Universally_unique:
        __cartesianProduct = sorted(set(__cartesianProduct))
        for __element in __cartesianProduct:
            if __element[0] == __element[1]:
            __cartesianProduct.remove(__element)
    return __cartesianProduct


def main():

    __args = createArgumentParser()

    for __element in cartesianProduct(__args.unique, __args.Universally_unique, *__args.list):
        print(__element)

使用命令行参数abc 123 def运行程序将返回以下内容:

('a', 'd')
('a', 'e')
('a', 'f')
('b', 'd')
('b', 'e')
('b', 'f')
('c', 'd')
('c', 'e')
('c', 'f')

笛卡尔积缺少123部分。 我该如何解决?

要获取列表中所有项目的笛卡尔积,可以使用*运算符执行参数解包。 有时将其称为“展开”拆包。

from itertools import product

src = ['abc', '123',  'def']
cartesian_product = [''.join(t) for t in product(*src)]
print(cartesian_product)

输出

['a1d', 'a1e', 'a1f', 'a2d', 'a2e', 'a2f', 'a3d', 'a3e', 'a3f', 'b1d', 'b1e', 'b1f', 'b2d', 'b2e', 'b2f', 'b3d', 'b3e', 'b3f', 'c1d', 'c1e', 'c1f', 'c2d', 'c2e', 'c2f', 'c3d', 'c3e', 'c3f']

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM