在python中重新计算字典中的值

时间:2019-07-19 06:37:44

标签: python list dictionary

我有一个类似

的列表
result =[{'a': 5}, {'b': 4}, {'c': 3}, {'ar': 10}, {'ade': 10}]

现在,我想重新叙述这些词典的价值。例如,“ a”是'ar'len(a)/len(ar)=1/2的子类,因此{'a':5}变成{'a':5+10/2}。 此外,“ a”是“ ade”的子字符串,并且len(a)/ len(ade)= 1/3。最后,它应该是{'a':5 + 10/2 + 10/3}。那么如何不用for方法解决这个问题呢?

我发现我可以在上一步中将结果转换为字典,但是我仍然需要使用method。

5 个答案:

答案 0 :(得分:0)

result =[{'a': 5}, {'b': 4}, {'c': 3}, {'ar': 10}, {'ade': 10}]

relation = []
valor = {}

for example in range(0, len(result)):
    for example2 in list(result[example].keys()):
        for examplex in range(0, len(result)):
            if examplex != example and example2[0] in list(result[examplex].keys())[0] and list(result[examplex].keys())[0] not in relation:
                #print('True')
                relation.append(list(result[examplex].keys())[0])
                print(list(result[examplex].keys())[0], list(result[examplex].values())[0])
                if example2[0] not in valor:
                    print("No existe, se crea como un valor nuevo.")
                    valor[example2[0]] = list(result[example].values())[0] + list(result[examplex].values())[0] / len(list(result[examplex].keys())[0])
                elif example2 in valor:
                    print("Existe, se esta modificando.")
                    valor[example2[0]] += list(result[examplex].values())[0] / len(list(result[examplex].keys())[0])

print(valor[example2[0]])

'''Here you can iterate with for :) valor, 1 hour for do it 0_0'''

答案 1 :(得分:0)

    result =[{'a': 5}, {'b': 4}, {'c': 3}, {'ar': 10}, {'ade': 10}]
    dd ={}
    v=0
    for i in result:
        key=i.keys()[0]
        if key.__contains__('a'):
            l=i[key]/len(key)
            v = v+l
    dd={'a':v}
    #dd ={'a': 13}

答案 2 :(得分:0)

使用列表理解

  • round(number[, ndigits])-round()方法返回四舍五入到小数点后给定n位数字的浮点数。

例如。

result =[{'a': 5}, {'b': 4}, {'c': 3}, {'ar': 10}, {'ade': 10}]

for index,x in enumerate(result):
    key = list(x.keys())[0]
    # get all key substring dictionary
    subtring_value = {list(result[y].keys())[0] : list(result[y].values())[0]
                       for y in range(index+1,len(result)) if key in list(result[y].keys())[0]}
    if len(subtring_value) > 0:
        total = list(x.values())[0]
        for k,v in subtring_value.items():
            total = total + v/len(k)

        x[key] = round(total,2)

print(result)

O / P:

[{'a': 13.33}, {'b': 4}, {'c': 3}, {'ar': 10}, {'ade': 10}]

答案 3 :(得分:0)

使用itertools.product的一种解决方案:

from itertools import product

result = [{'a': 5}, {'b': 4}, {'c': 3}, {'ar': 10}, {'ade': 10}]

out = {}
for v1, v2 in product(result, repeat=2):
    i1 = [*v1][0]
    i2 = [*v2][0]
    if i1 in i2:
        out.setdefault(i1, []).append((i2, v2[i2]))

result = []
for k, v in out.items():
    s = 0
    for (vv, cnt) in v:
        s += cnt * (len(k) /  len(vv))
    result.append({k : s})

print(result)

打印:

[{'a': 13.333333333333332}, {'b': 4.0}, {'c': 3.0}, {'ar': 10.0}, {'ade': 10.0}]

答案 4 :(得分:0)

预期输出不清楚(“ ar”与“ ade”?),但是我建议使用defaultdict中的collections,方法是:

from collections import defaultdict

result =[{'a': 5}, {'b': 4}, {'c': 3}, {'ar': 10}, {'ade': 10}]

res = defaultdict(list)

for h in result:
  key = list(h.keys())[0]
  val = list(h.values())[0]
  key_f = key[0]
  size = len(key)
  print(size)
  res[key_f].append(val/size)

此步骤产生:

defaultdict(<class 'list'>, {'a': [5.0, 5.0, 3.3333333333333335], 'b': [4.0], 'c': [3.0]})

然后将转换值迭代到列表的总和:

for k, v in res.items():
  res[k] = sum(v)


print(dict(res))
#=> {'a': 13.333333333333334, 'b': 4.0, 'c': 3.0}