Python字典比较值

2024-09-28 23:29:26 发布

您现在位置:Python中文网/ 问答频道 /正文

问题是如何通过基于max和low value的键提取值来解析字典。然后比较其中的值,并根据计算添加一些关键值。也许问题很复杂,但我会用代码提供更多的解释。在

json对象

[
    {
        "YCI": 0.014076729909151329,
        "TCI": 0.5610661498232027,
        "FCI": 0.327632092582722,
        "TFCI": 3.04906430661623,
        "naziv": "HDZ",
        "YCSI": 14.49723089452966
    },
    {
        "YCI": 0.04249999676677044,
        "TCI": 0.33129318126147167,
        "FCI": 1.677073944380761,
        "TFCI": 4.326953034001479,
        "naziv": "HNS",
        "YCSI": 56.80909574468085
    },
    {
        "YCI": 0,
        "TCI": 0.40603351151808614,
        "FCI": 0,
        "TFCI": 12.61045547126369,
        "naziv": "HSP AS",
        "YCSI": 0
    },
    {
        "YCI": 2.231205214448367,
        "TCI": 0,
        "FCI": 0,
        "TFCI": 0,
        "naziv": "HSS",
        "YCSI": 949.343111111111
    }
]

好的,这是我的字典。现在如何比较字典中的键:

  • YCI公司
  • TCI公司
  • FCI公司
  • TFCI公司
  • 纳齐夫
  • YSCI公司

以他们的价值观为基础。如果值YCI的值最大,那么它应该在新字典中设置数字1,并且该逻辑也应用于字典中的其他键。 输出如下:

json输出

^{pr2}$

最大值得到数字1,最小值取决于dictionary包含多少对象。在

代码尝试

print max(nvalues[0].iteritems(), key=operator.itemgetter(1))[1]

有了这段代码,我可以提取最高值,但是如何在字典的值内对其进行排序。如果你能给我一些逻辑来解决这个问题,我将不胜感激。在


Tags: 对象代码json字典公司数字逻辑max
2条回答
import six

raw_object = [
    {
        "YCI": 0.014076729909151329,
        "TCI": 0.5610661498232027,
        "FCI": 0.327632092582722,
        "TFCI": 3.04906430661623,
        "naziv": "HDZ",
        "YCSI": 14.49723089452966
    },
    {
        "YCI": 0.04249999676677044,
        "TCI": 0.33129318126147167,
        "FCI": 1.677073944380761,
        "TFCI": 4.326953034001479,
        "naziv": "HNS",
        "YCSI": 56.80909574468085
    },
    {
        "YCI": 0,
        "TCI": 0.40603351151808614,
        "FCI": 0,
        "TFCI": 12.61045547126369,
        "naziv": "HSP AS",
        "YCSI": 0
    },
    {
        "YCI": 2.231205214448367,
        "TCI": 0,
        "FCI": 0,
        "TFCI": 0,
        "naziv": "HSS",
        "YCSI": 949.343111111111
    }
]

#make a list (equal in length to original object) of empty dictionaries
ranks_object = [{} for i in raw_object]

#iterate through each key in the first dictionary
#(I assumed that all dictionaries will have the same keys)
for key in raw_object[0]:

    #create a list with the value for this key from all dictionaries 
    raw_list = [group[key] for group in raw_object]

    #sort and store the list
    sorted_raw_list = sorted(raw_list)

    #create a list of the ranks of each of the raw values
    #if the value is greater than zero, a value's rank is the length
    #  of the raw list minus the index of the value in the sorted list
    #otherwise, the rank should be 0 (as indicated by OP's desired output)
    ranks = [len(raw_list) - sorted_raw_list.index(value) if value > 0 else 0 for value in raw_list]

    #iterate through each rank in the ranks list (with access to the
    #  list index, which will be used to make sure that the rank is
    #  inserted into the proper dictionary)
    for index, rank in enumerate(ranks):

        #if the value for the key in the first dictionary is a string,
        #  insert the original value with the key
        #(I assumed that if one dictionary has a string value for a
        #  certain key, all of the dictionaries do as well)
        if isinstance(raw_object[0][key], six.string_types):
            ranks_object[index][key] = raw_object[index][key]

        #otherwise insert the rank with the key
        else:
            ranks_object[index][key] = rank

#display each rank dictionary separately to improve readability
for x in ranks_object:
    print x
def rank_by_value(list_dicts):

    from operator import  itemgetter
    from itertools import groupby

    nums = []
    symbs = []

    # separting keys, values into two lists
    # one for numeric values, the other for string values
    for indx, d in enumerate(list_dicts):
        for k, val in d.items():
            if type(val) in (int,float):
                nums.append((indx,k,val))
            else:
                symbs.append((indx,{k:val}))

    groups = []
    # grouping lists
    for k, g in groupby(nums, key=itemgetter(0)):
        groups.append(list(g))

    allData = []
    # sorting lists by by each dictionry values and assinging ranks
    for g in groups:
        sort_ed = sorted(g, key=itemgetter(2), reverse=True)
        ranked = [ list((t,i+1)) for i,t in enumerate(sort_ed)]
        allData.append(ranked)
        ranked = []

    # remove numerical data
    for zero in allData:
        for i, el in enumerate(zero):
           one,two, _ = el[0]
           zero[i] = one,(two, el[1])

    # now creating dictionaries anew
    list_of_dict = []
    dict_temp = {}

    for i, (el, sy) in enumerate(zip(allData, symbs)) :
        for l in el:
            name_, rank_ = l[1]
            dict_temp[name_] = rank_
        dict_temp.update(symbs[i][1])
        list_of_dict.append(dict_temp)
        dict_temp = {}



    return list_of_dict



 for el in rank_by_value(jsn):
    print(el)


{'TCI': 3, 'YCSI': 1, 'naziv': 'HDZ', 'YCI': 5, 'FCI': 4, 'TFCI': 2}
{'TCI': 4, 'YCSI': 1, 'naziv': 'HNS', 'YCI': 5, 'FCI': 3, 'TFCI': 2}
{'TCI': 2, 'YCSI': 3, 'naziv': 'HSP AS', 'YCI': 4, 'FCI': 5, 'TFCI': 1}
{'TCI': 3, 'YCSI': 1, 'naziv': 'HSS', 'YCI': 2, 'FCI': 4, 'TFCI': 5}

相关问题 更多 >