Как вернуть наибольшее значение с плавающей запятой в словаре? - PullRequest
0 голосов
/ 12 ноября 2018

Ниже приведены мои коды, которые я пробовал, метод check_keyword () должен в основном сравнивать строку со словарем слов, если слова совпадают, увеличивать счетчик и находить наибольшее значение в словаре:

Пожалуйста, обратите внимание на коды, в которых я прокомментировал "найти максимальное значение с плавающей запятой"

def check_keyword():
    new_dict = {}
    count_dict = {}
    new_list = []
    new_list2 = []
    count = 0
    with open(unknown.txt, "r") as fp:
        unknown_file = fp.read()
        print(unknown_file)
        # read key phases from text file as a dictionary
    df = pd.read_csv(key_phases.txt, sep='|')
    key_phases_dict = df.to_dict(orient='records')

    for i in key_phases_dict:
        new_list = list(i.values())
        new_dict[new_list[0]] = new_list[1]

    for key in new_dict.keys():
        count_dict[key] = 0
        new_list2 = new_dict[key].split(",")
        new_dict[key] = new_list2
        for j in new_dict[key]:
            if j in unknown_file:
                print(j)
                count_dict[key] = count_dict[key] + 1
        count_dict[key] = float(count_dict[key] / len(new_list2))
    print(count_dict)
    # find the maximum float value 
    for k, v in count_dict.items():
        if v > count:
            highest_list = []
            result = k, v
            highest_list.append(result)
            count = v
        else:
            v == count
            result = k, v
            highest_list.append(result)

    return highest_list

Вывод count_dic:

{2: 0.02666666666666667, 3: 0.08666666666666667, 4: 0.08666666666666667, 5: 0.0, 6: 0.04666666666666667, 7: 0.02, 8: 0.013333333333333334}

Проблема, с которой я столкнулся, заключается в том, что, когда я печатаю самый высокий список, он дает мне (он не показывает мне самое высокое значение):

[(3, 0.08666666666666667), (4, 0.08666666666666667), (5, 0.0), (6, 0.04666666666666667), (7, 0.02), (8, 0.013333333333333334)]

Желаемый результат для достижения:

[(3, 0.08666666666666667),(4, 0.08666666666666667)]

Ответы [ 3 ]

0 голосов
/ 12 ноября 2018

Вы можете просто рассчитать максимальное значение и затем использовать понимание списка:

d = {2: 0.02666666666666667, 3: 0.08666666666666667, 4: 0.08666666666666667, 5: 0.0, 6: 0.04666666666666667, 7: 0.02, 8: 0.013333333333333334}

maxval = max(d.values())
res = [(k, v) for k, v in d.items() if v == maxval]

[(3, 0.08666666666666667), (4, 0.08666666666666667)]
0 голосов
/ 12 ноября 2018

Вот два способа сделать это.

Один с sorted и списком:

d = {2: 0.02666666666666667, 3: 0.08666666666666667, 4: 0.08666666666666667, 5: 0.0, 6: 0.04666666666666667, 7: 0.02, 8: 0.013333333333333334}

sorted_items = sorted(d.items(), key=lambda x: x[1], reverse=True)
results = [item for item in sorted_items if item[1] == sorted_items[0][1]]

# output: [(3, 0.08666666666666667), (4, 0.08666666666666667)] #

А другой с sorted и filter:

d = {2: 0.02666666666666667, 3: 0.08666666666666667, 4: 0.08666666666666667, 5: 0.0, 6: 0.04666666666666667, 7: 0.02, 8: 0.013333333333333334}

sorted_items = sorted(d.items(), key=lambda x: x[1], reverse=True)
results = filter(lambda x: x[1] == sorted_items[0][1], sorted_items)

# output: [(3, 0.08666666666666667), (4, 0.08666666666666667)] #

С помощью sorted вы можете использовать key для сортировки элементов по значениям словаря. sorted_items даст вам:

[(3, 0.08666666666666667), (4, 0.08666666666666667), (6, 0.04666666666666667), (2, 0.02666666666666667), (7, 0.02), (8, 0.013333333333333334), (5, 0.0)]

Включая reverse, это делает первый индекс результатов самым высоким значением.

2-я строка для получения results - отфильтровать список, если есть несколько индексов с одинаковым максимальным значением. После этого он урезает список, и вы получите два последних значения.

0 голосов
/ 12 ноября 2018

вместо

v == count
result = k, v
highest_list.append(result)

Попробуйте:

v = count
result = k, v
highest_list.append(result)

Другими словами, измените == на =.

...