【问题标题】:Iterate with variant for loops使用变体 for 循环进行迭代
【发布时间】:2017-05-17 12:22:35
【问题描述】:

我想定义一个函数,它采用变体长度list,然后对list 中的每个元素(字典)执行for 循环。

为了更具体,我提供了 3 个实例来说明我想要实现的目标:

# preparation: create a dict to hold the data
result = dict()
for event in target.outcomes:
    result[event] = 0

#### Instance 1.
parent_list = [parent0,parent3] # element of the list is dict

for key0,value0 in parent0.items():
    for key1, value1 in parent3.items():
        for t_key, t_value in target.pmfs[(key0,key1)].items(): # current node
            result[t_key] += t_value*value0*value1

#### Instance 2.
parent_list = [parent0] # element of the list is a dict

for key0, value0 in parent0.items():
    for t_key, t_value in target.pmfs[(key0,)].items(): # current node
        result[t_key] += t_value*value0

#### Instance 3.
parent_list = [] # element of the list is a dict

for t_key, t_value in target.pmfs[()].items(): # current node
    result[t_key] += t_value

所需结构:

def(target, parent):
    result = dict()
        for event in target.outcomes:
            result[event] = 0
    ...
    return result

【问题讨论】:

  • 递归例程在这种情况下可能会有所帮助
  • 也许你应该使用递归
  • 你将如何处理最后一个for 循环中的target.pmfs[()],因为它的值取决于之前的for 循环。

标签: python list python-3.x for-loop


【解决方案1】:

您可以使用 itertools.product 代替嵌套的 for 循环来生成 dicts 和 functool.reduce 的元组来乘以字典的值

虚拟数据生成

p1 = {'a': 1, 'b': 2}
p2 = {'c': 4, 'd': 8}

虚拟 mpfs

def pmfs(args):
    c = 10
    d = dict()
    for i, a in enumerate(args):
        d['%s_pmfs' % a] = 10 + i * 3

    if not d:
        return {'dummy': 10, 'dummy2': 15}
    return d

链数

链式乘法,来自this SO answer

def chain_mul(iterable):
    import functools
    import operator
    return functools.reduce(operator.mul, iterable)

实际解决方案

如果您将result 设为defaultdict,则不必像您一样在开始时对其进行初始化

def special_product(parents):
    result = defaultdict(int)

    for parent in itertools.product(*(p.items() for p in parents)):
        # print(parents)
        if parents:
            for t_key, t_value in pmfs(p[0] for p in parent).items():
                result[t_key] += t_value * chain_mul(p[1] for p in parent)
        else:    #parents was empty
            for t_key, t_value in pmfs([]).items():
                result[t_key] += t_value

    return dict(result)

结果

案例一

special_product([p1, p2])

{'a_pmfs': 120, 'b_pmfs': 240, 'c_pmfs': 132, 'd_pmfs': 264}

案例 2

special_product([p1])

{'a_pmfs': 10, 'b_pmfs': 20}

案例 3

special_product([p1])

{'dummy': 10, 'dummy2': 15}

您需要通过 target.mpfs() 验证这一点

【讨论】:

    猜你喜欢
    • 2010-09-11
    • 2020-07-30
    • 1970-01-01
    • 2020-10-21
    • 1970-01-01
    • 1970-01-01
    • 2014-04-27
    • 2022-01-23
    • 1970-01-01
    相关资源
    最近更新 更多