Одно значение для нескольких ключей

Рейтинг: 0Ответов: 2Опубликовано: 19.05.2023
info_dict = {}
with open('xx.txt', 'r') as f:
    lines = f.readlines()
    for line in lines:
        key, value= line.strip().split(':')
        info_dict[key] = value

Есть такой код. Представим что есть несколько, почти одинаковых, ключей, для которых должно быть одно значение как это можно сделать?

Ответы

▲ 1Принят

Это пример кода, который может решить проблему, но для этого нужно знать все похожие ключи(полагаю с этим проблем не будет их можно получить с помощью того же pymorph3), которые попадают в группу с одинаковым значением и знать, какое значение для этих ключей. В примере словарь из пар ключ-название числа и значение-значение числа, превращается в словарь из пар ключ-название числа и значение-количества цифр в числе.

nums = {'one': 1, 'two': 2, 'three': 3, 'eleven': 11, 'twelve': 12, 'thirteen': 13} #заменим значение числа на длинну числа(1 для однозначных, 2 для двузначных)
lenth = [(['one', 'two', 'three'], 1), (['eleven', 'twelve', 'thirteen'], 2)] #список кортежей в котором первый элемент-список целевых ключей, второй элемент значение для этих ключей
for i in lenth:
    for k, v in nums.items():
        if k in i[0]:
            nums[k] = i[1]
print(nums) # результат {'one': 1, 'two': 1, 'three': 1, 'eleven': 2, 'twelve': 2, 'thirteen': 2}

В целом вам нужно создать список кортежей, в которых будет храниться 2 элемента(список похожих ключей и одно значение для этих ключей), а затем запустить двойной цикл. В примере используется словарь nums, у вас это будет словарь info_dict.

▲ 0

Например, так:

info_dict = {}

with open('xx.txt', 'r') as f:
    lines = f.readlines()

    for line in lines:
        key, value = line.strip().split(':')

        # проверяем, если ключ уже существует в info_dict
        if key in info_dict:
            # если ключ уже существует
            if type(info_dict[key]) == str:
                # ...и он не является массивом
                # то мы просто делаем значение с ключом key массивом
                info_dict[key] = [info_dict[key]]

            # а если значение уже является массивом
            # добавляем в этот массив ещё одно значение
            info_dict[key].append(value)

            # и переходим к следующей итерации, чтобы значение (массив) не перезаписалось строкой
            continue

        # если не добавлять выше continue, то выполнится эта строка
        info_dict[key] = value # ...и перезапишет массив

print(info_dict)

Код объяснил в комментариях.

Если что-то непонятно, спрашивайте!