使用键中缺少的值添加字典值

时间:2017-10-13 17:31:55

标签: python-2.7 dictionary

我有以下三个词典:

<tbody>
@foreach($dealCoupons->chunk(3) as $chunked_coupons)
    <tr>
        @foreach( $chunked_coupons as $dealCoupon )
            <td>
                <input type="checkbox" name="coupon" class="cekbox" value="{{$dealCoupon->CouponNo}}">
                <strong>{{$dealCoupon->CouponNo}}</strong>
            </td>
        @endforeach
    </tr>
@endforeach

根据Mydict = {'(1)': 850.86, '(1, 2)': 1663.5, '(1, 2, 3)': 2381.67, '(1, 3)': 1568.89, '(2)': 812.04, '(2, 3)': 1529.45, '(3)': 717.28} A = {1: 4480.0, 2: 3696.0, 3: 4192.5} B = {1: 1904.62, 2: 1709.27, 3: 1410.73} 中的键,我想添加Mydict的缺失键值。例如,对于min(A, B)中的第一个键'(1)',我想将Mydict添加到第一行的值并更新该字典中的值。同样,对于密钥的值:min(A[2], B[2]) + min(A[3], B[3]),我想添加'(1, 2)',因为其中只缺少min(A[3] + B[3])。对于3,我不需要添加任何内容,因为它涉及所有3个数字,即1,2和3.因此,我的新'(1, 2, 3)'将如下:

Mydict

在此示例中,Mynewdict = {'(1)': 3970.86, '(1, 2)': 3074.23, '(1, 2, 3)': 2381.67, '(1, 3)': 3278.16, '(2)': 4127.39, '(2, 3)': 3434.07, '(3)': 4331.17} 的所有值都小于B的值,但是,可能并非总是如此,这就是为什么我要添加至少那些。谢谢你的回答。

1 个答案:

答案 0 :(得分:1)

数字列表听起来不错,但对我来说似乎仍然需要与以下解决方案类似的(类似)操作:

import re

str_pat = re.compile(r'\((.*)\)')

Mynewdict = Mydict
for key in Mynewdict.keys():

    match = (str_pat.findall(key)[0]).split(',')

    # set(list(map(int, match))) in Python 3.X
    to_add = list(set(A.keys()).difference(set(map(int,match))))

    if to_add:
        for kAB in to_add:
            Mynewdict[key] += min(A[kAB],B[kAB])

对于Mynewdict中的每个键,此程序会找到括号之间的模式,并将其转换为match分隔的,列表。然后将该列表与A中的键列表进行比较。

比较遍历集合 - 程序构造从两个列表中设置并将集合差异(也转换为列表)返回到to_add。因此,to_addA中包含密钥的列表,这些密钥不是Mynewdict中复合键中不存在的数字。这假设B中的所有密钥也出现在A中。 map用于将match中的字符串转换为整数(用于与A中作为整数的键进行比较)。要在Python 3.X中使用它,您需要另外将map(int, match)转换为注释中所述的列表。

程序的最后一部分为每个缺失的密钥为Mynewdict的现有值分配A和B之间的最小值。由于Mynewdict最初是Mydict的副本,因此所有最终键和初始值都已存在,因此程序无需检查键存在或显式添加初始值。

要查找Mynewdict中与特定值对应的键,您实际上必须遍历字典:

find_val = round(min(Mynewdict.values()),2)
for key,value in Mynewdict.items():
    if find_val == round(value,2):
        print key, value

这里重要的是四舍五入。这是必要的,因为Mynewdict中的值具有可变精度,该精度通常比您要查找的值的精度更长。换句话说,没有round(value,2),如果在实际False的情况下会评估为True