Наложить условный оператор IF при обновлении значений словаря - PullRequest
0 голосов
/ 25 марта 2020

Я работаю над определением максимального значения (третьего значения в кортеже), разделяемого между первыми двумя значениями, представленными в кортеже.

Я создал defaultdict, который использует отсортированные сцепленные значения первых двух значений кортежа в качестве клавиши di c и назначаю значение di c в качестве третьего значения кортежа.

Как я могу навязать условие, чтобы, когда я сталкиваюсь с той же парой, я заменял значение di c на большее значение? Я только хочу прочитать мой список один раз, чтобы быть эффективным.

users = [
    ('2','1',0.7),
    ('1','2', 0.5),
    ('3','2', 0.99),
    ('1','3', 0.78),
    ('2','1', 0.5),
    ('2','3', 0.99),
    ('3','1', 0.78),
    ('3','2', 0.96)]

#The above list is much longer ~10mill+, thus the need to only read through it once. 
#Current code

from collections import defaultdict

user_pairings = defaultdict()

for us1, us2, maxval in users:
    user_pairings[''.join(sorted(us1+us2))] = maxval ##-> How to impose the condition here? 

print(user_pairings)

РЕДАКТИРОВАТЬ Только что осознал серьезный недостаток в моем подходе. Если значения, используемые для ключей, не являются одинарными di git, то мой вывод не будет правильным результатом из-за использования sorted.

Ответы [ 2 ]

0 голосов
/ 25 марта 2020

Вы можете использовать метод словаря get, чтобы проверить, существует ли key в словаре, возвращая 0, если его нет, и затем присвоить max этого значения и текущего значения key:

user_pairings = {}

for us1, us2, maxval in users:
    key = '-'.join(sorted([us1, us2]))
    user_pairings[key] = max(maxval, user_pairings.get(key, 0))

print(user_pairings)

Вывод для ваших образцов данных:

{'1-3': 0.78, '2-3': 0.99, '1-2': 0.7}

Примечание. Я не вижу особого смысла в преобразовании us1 и us2 в строку, так что что sorted может затем разбить его обратно в список. Можно также просто использовать список [us1, us2] для начала.

Используя список и join с символом (я использовал -, но любой подойдет), мы можем избежать проблемы, которая может возникнуть, когда значения us1 и us2 иметь несколько цифр (например, если us1, us2 = 1, 23 и us1, us2 = 12, 3).

0 голосов
/ 25 марта 2020

По способу это будет заменить:

    user_pairings[''.join(sorted(us1+us2))] = maxval

на:

    key = ''.join(sorted(us1 + us2))
    user_pairings[key] = max(maxval, user_pairings[key] if key in user_pairings else 0)
...