簡體   English   中英

Python字典 - 比較值

[英]Python dictionary - compare values

問題是如何通過基於最大值和低值的鍵提取值來解析字典。 然后比較其中的值,並根據計算添加一些鍵值。 也許問題很混亂,但我會用代碼提供更多解釋。

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 的值最高,則 YCI 應在新字典中設置數字 1,並且該邏輯也適用於字典中的其他鍵。 輸出將類似於:

json-輸出

  [
    {
        "YCI": 3,
        "TCI": 1,
        "FCI": 2,
        "TFCI": 3,
        "naziv": "HDZ",
        "YCSI": 3
    },
    {
        "YCI": 2,
        "TCI": 3,
        "FCI": 1,
        "TFCI": 2,
        "naziv": "HNS",
        "YCSI": 2
    },
    {
        "YCI": 0,
        "TCI": 2,
        "FCI": 0,
        "TFCI": 1,
        "naziv": "HSP AS",
        "YCSI": 0
    },
    {
        "YCI": 1,
        "TCI": 0,
        "FCI": 0,
        "TFCI": 0,
        "naziv": "HSS",
        "YCSI": 1
    }
]

最大值為 1,最小值取決於字典包含的對象數量。

代碼嘗試

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

使用此代碼,我可以提取最高值,但如何在其值中對字典進行排序。 如果你能給我一些解決這個問題的邏輯,我將不勝感激。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM