【问题标题】:Comprehension with variable number of arguments?理解可变数量的参数?
【发布时间】:2019-10-17 04:55:49
【问题描述】:

是否可以像Haskell 那样以编程方式构建理解来处理可变数量的参数?

例如,如何将字典的这个外积扩展到2个以上的字典:

def outer(f,g):
    return lambda d1,d2: {f(k1,k2):g(v1,v2) for k1,v1 in d1.items() for k2,v2 in d2.items()}

给定:

d1 = {'a':1, 'b':2}
d2 = {'a':10, 'b':11, 'c':12}

以及这些使用变量 args 的辅助函数:

def string_join(*arg):
    return ''.join(tuple(arg))

def arg_sum(*arg):
    return sum(tuple(arg))

然后:

outer(string_join,arg_sum)(d1,d2)

{'aa': 11, 'ab': 12, 'ac': 13, 'ba': 12, 'bb': 13, 'bc': 14}

方便的理解可以扩展到变量 arg (d1,d2,d3...) 还是需要使用 for 循环?

【问题讨论】:

    标签: python dictionary-comprehension


    【解决方案1】:

    该语言不直接支持这一点(因为里程表控制流程在字节码级别非常不同),但可以通过 itertools.product 和广泛的 * 解包来实现:

    def outer1(f,g,e):
      a,b=zip(*e)
      return f(*a),g(*b)
    def outer(f,g):
      return lambda *dd: dict(outer1(f,g,e) for e in itertools.product(*(d.items() for x in dd)))
    

    【讨论】:

    • @David,谢谢将对此进行测试。什么是“里程表控制流程”?
    • @alancalvitti:使用 bignum 循环(通常由大小在运行时确定的数组原始整数组装而成)涉及一个内部循环来实现进位,就像里程表的每个轮子转动下一个时一样它翻了。
    猜你喜欢
    • 2017-08-04
    • 1970-01-01
    • 1970-01-01
    • 2013-03-14
    • 2018-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多