#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. я обновил тему комментариями из обзора