我试图想出一种方法来增加两个字典的值,其中一个字典包含列表

时间:2017-06-12 06:20:11

标签: python list python-3.x dictionary math

我在这里做了意大利面条代码的母亲。这应该通过指定哪个(因子1,因子2)然后根据修剪器是什么来修剪不可乘法的结果(如果修剪为1)来将两个字典(kv1和kv2)的键和/或值相乘(例如0)或[])。

所以,这就是我要做的事情:

  1. 找出一种更简单的方法,将factor1和factor2分配给适当的k1 / k2 / v1 / v2

  2. 尝试正确压缩,因为adsVal是包含列表的字典,而valSet是包含字符串的字典。

  3. 尝试将每个列表中的值乘以valSet中各自的字符串(因此adsVal中每个列表中的值5将乘以{{1}的第五个值})

  4. 弄清楚如何将所有不能相乘的东西(即任何不能为int()的字符串)转换为修剪器(例如0)或至少将其与其键一起删除

  5. 代码是:

    valSet

    任何事都会做,我只是想学习。感谢。

    示例输入:

    def multDict(kv1, kv2, factor1, factor2, pruning, pruner):
        # This multiplies something in two dictionaries
        # With pruning on, null values become the pruner
        if factor1 == 'k1':
            factor1 = kv1.keys()
        elif factor1 == 'k2':
            factor1 = kv2.keys()
        elif factor1 == 'v1':
            factor1 = kv1.values()
        elif factor1 == 'v2':
            factor1 = kv2.values()
        if factor2 == 'k1':
            factor2 = kv1.keys()
        elif factor2 == 'k2':
            factor2 = kv2.keys()
        elif factor2 == 'v1':
            factor2 = kv1.values()
        elif factor2 == 'v2':
            factor2 = kv2.values()
        x3 = []
        for x1 in factor1:
            zipped = zip(x1, factor2)
            for y1, x2 in zipped:
                printtxt(x2)
                try:
                    int(y1)
                    int(x2)
                except:
                    pass
                else:
                    print(int(y1)*int(x2))
        return x3
    
    print(multDict(adsVal, valSet, 'v1', 'v2', 1, 0))
    

    示例输出:

    adsVal = {'Students': ['inactive', '3'], 'Campaign 1': ['not_delivering', '']}
    
    valSet = {'Delivery': [''], 'Results': ['1000']}
    

1 个答案:

答案 0 :(得分:1)

import collections

def mul_maybe_ints(a, b, pruner=None):
    try:
        return int(a)*int(b)
    except ValueError:
        return pruner

def strings_times_strings(aa, ab, pruner=None):
    return [mul_maybe_ints(a, b, pruner) for a,b in zip(aa,ab)]

def lists_times_strings(aa, sa, pruner=None):
    return [[mul_maybe_ints(el, s, pruner) for el in a] for a,s in zip(aa,sa)]


# example usage
adsVal = collections.OrderedDict()
adsVal['Students'] = ['inactive', '3']
adsVal['1'] = ['not_delivering', '']

valDict = collections.OrderedDict()
valDict['Delivery'] = '50'
valDict['Results'] = '1000'

result = lists_times_strings(adsVal.values(), valDict.values(), 0)
print( result )  # [[0, 150], [0, 0]]
print( { k : v for k,v in zip(adsVal, result) } )  # {'Students': [0, 150], '1': [0, 0]}

print( strings_times_strings(adsVal.keys(), valDict.values(), 0) )  # [0, 1000]

一些注意事项:

  • 我还不完全清楚你特别想做什么
  • 正如我在评论中所说的,一本字典没有"第五"因为它是无序的元素,这就是我使用OrderedDict
  • 的原因
  • 我总是修剪,因为乘以两个非整数不是一个定义的操作
  • 这只给你回复列表,所以你必须在调用站点上构建字典(参见示例,你也可以将它包装到它自己的函数中)。