循环的变量迭代

2024-04-20 13:16:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我想定义一个函数,它采用不同的长度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

Tags: thekeyineventtargetforvalueitems
1条回答
网友
1楼 · 发布于 2024-04-20 13:16:05

您可以使用itertools.product而不是嵌套的for循环来生成dicts和functool.reduce的元组来乘以dict的值

虚拟数据生成

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)

结果

案例1

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()验证这一点

相关问题 更多 >