我有以下三个词典:
<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
的值,但是,可能并非总是如此,这就是为什么我要添加至少那些。谢谢你的回答。
答案 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_add
是A
中包含密钥的列表,这些密钥不是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
。