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

#python #collections

Вопрос:

Я написал функцию, которая изменяет значения и ключи между собой. Но я должен упростить это, используя только один цикл «ДЛЯ».

ЕСЛИ — ИНАЧЕ не разрешается

 def swap_dict(d):
    swapped_dict = {}
    for key, value in d.items():
        if value in swapped_dict:
            swapped_dict[value].append(key)
        else:
            swapped_dict[value] = [key]

    for key in swapped_dict.keys():
        swapped_dict[key] = tuple(swapped_dict[key])

    return swapped_dict


print(swap_dict({1: 2, 3: 4, 5: 4, 7: 2, 9: 4}))
 
 def swap_dict(d):
    swapped_dict = {}
    for key, val in d.items():
        swapped_dict.setdefault(val, set()).add(key)

    for key in swapped_dict.keys():
        swapped_dict[key] = tuple(swapped_dict[key])
    return swapped_dict

print(swap_dict({1: 2, 3: 4, 5: 4, 7: 2, 9: 4}))

 

Ответ №1:

Вы можете сделать это в одном цикле неэффективно, воссоздавая tuple значение каждый раз, когда появляется один и тот же ключ:

 def swap_dict(d):
    swapped_dict = {}
    for key, value in d.items():
        swapped_dict[value] = swapped_dict.get(value, tuple())   (key,)
    return swapped_dict
 

Обновление: использовал get() метод для замены if/else

Комментарии:

1. У меня есть отзыв, в котором я не могу использовать «если-иначе». Вместо этого мне нужно объединить два цикла:

2. for key, val in d.items(): swapped_dict.setdefault(val, set()).add(key) и второе с главного поста

3. И создает ли это кортежи, которые вам нужны?

4. отделенные друг от друга, они прекрасно работают. но я понятия не имею, как их объединить

5. Не могу отблагодарить тебя как следует! К сожалению, я не совсем понимаю, как работает эта часть (key,)

Ответ №2:

Вам просто нужно найти все ключи, имеющие искомое значение, чтобы вам не понадобился второй for цикл для сопоставления списков с кортежами.

 def swap_dict(d):
    swapped_dict = {}
    for value in set(d.values()):
        swapped_dict[value] = tuple([k for k,v in d.items() if v==value])

    return swapped_dict


print(swap_dict({1: 2, 3: 4, 5: 4, 7: 2, 9: 4}))
 

Тем не менее, понимание списка-это своего рода цикл для, я не думаю, что вы можете избежать этого.

Комментарии:

1. Вы могли бы сделать это более эффективным, выполнив цикл: for value in set(d.values()): это также делает вас if/else избыточным.

2. По большому счету, это серьезное понижение рейтинга. Вложенные циклы означают, что это O(n**2), тогда как оригинал-O(n).

3. я обновил тему комментариями из обзора