我有一个KV的列表,如下所示:
{'0-4': 0, '86-90': 0, '30-34': 0, '35-39': 0, '25-29': 0, '10-14': 0, '76-80': 0, '40-44': 0, '5-9': 0, '50': 0, '61-65': 0, '91-95': 0, '51-55': 0, '96-100': 0, '81-85': 0, '56-60': 0, '15-19': 0, '66-70': 0, '20-24': 0, '45-49': 0, '71-75': 0}
然后我有一个元组的对象我相信持有KV'
[(0, 4L), (5, 2L), (10, 2L), (15, 4L), (20, 5L), (25, 4L), (30, 4L), (35, 2L), (40, 1L), (45, 1L), (51, 7L), (56, 2L), (61, 4L), (66, 4L), (71, 4L), (76, 4L), (81, 8L), (86, 2L), (91, 1L), (96, 2L)]
我的目标是获取第二个对象中的键号,并将其与第一个对象中第一个数字范围的号码相匹配。并将该键的值设置为第二个对象中匹配对的值。 (即 - ' 0-4'将从第二个对象获得值(4),其中键是' 0'数字范围' 5-6'会得到' 5'等等的值(2)。
下面是我想要使用两个对象创建的最终返回(在匹配的数字范围内插入到对象1中的对象2的值):
{'0-4': 4, '86-90': 2, '30-34': 4, '35-39': 2, '25-29': 4, '10-14': 2, '76-80': 4, '40-44': 1, '5-9': 2, '50': 0, '61-65': 4, '91-95': 1, '51-55': 7, '96-100': 2, '81-85': 8, '56-60': 2, '15-19': 4, '66-70': 4, '20-24': 5, '45-49': 1, '71-75': 4}
这一点是将默认对象值all设置为0,因为第二个对象可能缺少某些匹配的数字范围。你会注意到没有' 50'在第二个对象中。在我的应用程序中,任何这些范围都可能在任何时候从第二个对象中丢失。所以我将所有数字范围设置为0,然后重新评估每个范围,如果它在第二个对象中。
我尝试在任一列表上进行循环并搜索' key' IN对象2键名。这似乎总是返回NO,因为我认为对象类型不匹配。
在堆栈溢出中发现了一个类似的问题让我做了类似的事情:
new_dict = dict((k, v) for k, v in dict.iteritems() if k in list)
这也没有用。
答案 0 :(得分:2)
要获取数字范围的第一个数字,我们将使用 split(' - ')并获取其第一个值。然后我们将其转换为整数。要从第二个对象中查找数字,我们将其转换为字典。 以下是生成的代码:
a = {'0-4': 0, '86-90': 0, '30-34': 0, '35-39': 0, '25-29': 0, '10-14': 0, '76-80': 0, '40-44': 0, '5-9': 0, '50': 0, '61-65': 0, '91-95': 0, '51-55': 0, '96-100': 0, '81-85': 0, '56-60': 0, '15-19': 0, '66-70': 0, '20-24': 0, '45-49': 0, '71-75': 0}
b = [(0, 4L), (5, 2L), (10, 2L), (15, 4L), (20, 5L), (25, 4L), (30, 4L), (35, 2L), (40, 1L), (45, 1L), (51, 7L), (56, 2L), (61, 4L), (66, 4L), (71, 4L), (76, 4L), (81, 8L), (86, 2L), (91, 1L), (96, 2L)]
b2 = dict(b)
c = {k: b2.get(int(k.split('-')[0]), 0) for k, v in a.items()}
答案 1 :(得分:0)
将第二个列表放入字典中是最简单的(并且有很多值,最快):您可以在其上调用dict
。然后使用字典理解来分割字符串键,将第一个字符串转换为数字,并使用它为转换后的字典编制索引。使用dict2.get(val,0)
应用默认值。
答案 2 :(得分:0)
假设您调用KV dict
和元组列表lst
。对于每个typle,请浏览字典并找到适当的密钥,然后将值添加到其中。您需要split('-')
来获取指定范围的数字,然后对其进行测试。
for k, v in lst:
for key in dict:
r = key.split('-')
if int(r[0]) < k < int(r[1]):
dict[key] += v
break
答案 3 :(得分:0)
你也可以尝试这个:
for i in inList:
for j in inDict:
if int(j.split('-')[0])==i[0]:
inDict[j]=i[1]
print(inDict)
输出:
{'45-49': 1, '0-4': 4, '96-100': 2, '81-85': 8, '51-55': 7, '25-29': 4, '56-60': 2, '20-24': 5, '35-39': 2, '10-14': 2, '50': 0, '76-80': 4, '66-70': 4, '30-34': 4, '40-44': 1, '86-90': 2, '15-19': 4, '91-95': 1, '5-9': 2, '61-65': 4, '71-75': 4}
答案 4 :(得分:0)
您可以使用字典理解,并为每个键创建一个d
字典,并访问s中原始字符串键的第一部分存储的值:
s = {'0-4': 0, '86-90': 0, '30-34': 0, '35-39': 0, '25-29': 0, '10-14': 0, '76-80': 0, '40-44': 0, '5-9': 0, '50': 0, '61-65': 0, '91-95': 0, '51-55': 0, '96-100': 0, '81-85': 0, '56-60': 0, '15-19': 0, '66-70': 0, '20-24': 0, '45-49': 0, '71-75': 0}
d = [(0, 4L), (5, 2L), (10, 2L), (15, 4L), (20, 5L), (25, 4L), (30, 4L), (35, 2L), (40, 1L), (45, 1L), (51, 7L), (56, 2L), (61, 4L), (66, 4L), (71, 4L), (76, 4L), (81, 8L), (86, 2L), (91, 1L), (96, 2L)]
new_s = {a:int(dict(d).get(int(a.split('-')[0]), 0)) for a, b in s.items()}
输出:
{'0-4': 4, '86-90': 2, '30-34': 4, '35-39': 2, '10-14': 2, '25-29': 4, '56-60': 2, '40-44': 1, '5-9': 2, '50': 0, '61-65': 4, '91-95': 1, '51-55': 7, '96-100': 2, '81-85': 8, '76-80': 4, '15-19': 4, '66-70': 4, '71-75': 4, '45-49': 1, '20-24': 5}