对象,两个对象中的键值组合

时间:2018-01-27 17:16:04

标签: python list

我有一个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)

这也没有用。

5 个答案:

答案 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}