【问题标题】:python two dimensional recursionpython二维递归
【发布时间】:2016-10-18 10:15:48
【问题描述】:

我列出了从命令行解析的键对及其可能的值。例如:

[('-a',['1','2','3']), ('-b',['1','2'])]

我的目标是产生如下组合:

prefix -a=1 -b=1 suffix
prefix -a=1 -b=2 suffix
prefix -a=2 -b=1 suffix
prefix -a=2 -b=2 suffix
prefix -a=3 -b=1 suffix
prefix -a=3 -b=2 suffix

问题是,列表可以是任意长度,子列表中的值也是如此。

可能的解决方案是使用某种递归,到目前为止我写的并没有给我想要的:

def runner(args, comd=""):
    for i in range(len(args)):
        op, vals = args[i]

        for val in vals:
            comd = op + "=" + val + " " + runner(args[1:], comd)

        if i == len(args) - 1:
            print ("prefix " + comd + " suffix")

    return comd

【问题讨论】:

    标签: python python-3.x recursion combinations


    【解决方案1】:

    你想做两个列表中的cartesian product。使用itertools.product() 执行此操作。例如:

    >>> my_list = [('-a',['1','2','3']), ('-b',['1','2'])]
    >>> from itertools import product
    >>> list(product(my_list[0][1], my_list[1][1]))
    [('1', '1'), ('1', '2'), ('2', '1'), ('2', '2'), ('3', '1'), ('3', '2')]
    

    它给出了两个列表中tuple 的所有组合的list


    现在,解决您的问题,下面是示例代码:

    my_list = [('-a',['1','2','3']), ('-b',['1','2'])]
    keys, value_list = zip(*my_list)
    for item in product(*value_list):
        val_list = ['{}={}'.format(key, val) for key, val in zip(keys, item)]
        print 'prefix {} suffix'.format(' '.join(val_list))
    
    # Output:
    prefix -a=1 -b=1 suffix
    prefix -a=1 -b=2 suffix
    prefix -a=2 -b=1 suffix
    prefix -a=2 -b=2 suffix
    prefix -a=3 -b=1 suffix
    prefix -a=3 -b=2 suffix
    

    说明:

    zip([iterable, ...]) 返回一个元组列表,其中第 i 个元组包含来自每个参数序列或可迭代对象的第 i 个元素。返回列表的长度被截断为最短参数序列的长度。比如上面的代码:

    >>> keys, value_list = zip(*my_list)  # zipping the unwrapped "my_list"
    >>> keys  # value of keys
    ('-a', '-b')
    >>> value_list  # value of values_list
    (['1', '2', '3'], ['1', '2'])
    

    然后我在values_list 上做笛卡尔积(如开头所述),然后再次在keys 和每个item 上做zip 笛卡尔积。

    【讨论】:

    • a 和 b 在哪里?另外你真的要手动索引一个包含 1000000 个键/值对的字典吗?
    • 您的代码没有执行 OP 的代码正在执行的操作,因此无论通用解决方案如何,您可能想要给出正确的解决方案或删除答案。
    • 感谢@anonymous 的回答和详细解释。
    猜你喜欢
    • 2012-11-19
    • 2014-02-17
    • 1970-01-01
    • 2015-11-08
    • 2013-01-01
    • 2019-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多