Словарь в Python, расширение значений ключа

737 просмотра
0
0 Комментариев

Каким образом/методом можно расширить значения объекта по ключу в словаре, есть ли универсальный метод или способ для этого без шаманства?
К примеру расширить значения в словаре с условием, описанном на Stepic:

def update_dictionary(d, key, value):
    if key in d:
        d[key] =+ (value)
    else:
        d.update({key*2:value})
    print (d)
d = {1:2, 2:3, 3:4}
update_dictionary(d, 1, -1)
update_dictionary(d, 2, 2)
update_dictionary(d, 5, 10)
update_dictionary(d, 1, 21)

  • Код написан неверно, он не работает как должен, написан для примера.

На выходе получается {1: 21, 2: 2, 3: 4, 10: 10}
, но в итоге нужно не полное замещение значений ключа а его расширение {1: -1, 21, key: value1, value2...} .
Подскажите, как это можно реализовать?


Добавить комментарий

3 Answers

Python Опубликовано 14.12.2018
0

Внимательно прочтите задание. Вам нужно в качестве значений словаря использовать списки:

dct = {
    'key1': [1, 2, 3],
    'key2': [4, 5, 6],
    'key3: []  # Пустой список
}

Таким образом «расширить значения объекта» можно просто добавив с список, соответствующий ключу, дополнительный элемент через append.

Добавить комментарий
0

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

def extend_dictionary(d, key, value):
   if key in d:
      if isinstance(d[key], list):
         d[key].append(value)
      else:
         d[key] = [d[key], value]
   else:
      d[key] = value

или так:

if key in d:
   try:
      d[key].append(value)
   except AttributeError:
      d[key] = [d[key], value]
else:
   d[key] = value


Вам нужно в первую очередь для себя понять, что именно Вы понимаете под «расширением» значения словаря. Просто можно придумать миллион способов — упаковка в список: [d[key], newvalue], в кортеж: (d[key], newvalue) или d[key] + (newvalue,) если d[key] — уже кортеж, в специальный класс типа Appendable с реализованным методом append, да хоть в строку str(d[key]) + ',' + str(newvalue), можно даже в словарь, счатающий повторения совпадающих значений: {1: {1: 1, 2: 3, 3: 1}, 2: {'x': 1, 1: 2}}. В конце концов тривиальное d[key] += newvalue — тоже можно назвать расширением.


Вот это: d[2 * key] = ... мне представляется крайне неудачным, т.к. что мы будем делать если ключ 2 * key in d --> True? На 3 умножать?


Дополню ответ (за настырность). Вы часто употребляете термин «последовательность» — value1, value2, .... Надо понять, что именно является последовательностью. В python реализовано несколько видов встроенных последовательностей — это список list, кортеж tuple, множество set, в известном смысле словарь dict. В С — только массив (прямых аналогов в питоне нет). В других языках другие. Можно реализовать свою последовательность:

class MySophisticatedSequence:
    def __init__(self, value):
        self.value = value
        self.current = 0
        if self.value < self.current:
            raise ValueError
 
    def append(self, newvalue):
        self.value += newvalue
 
    def __contains__(self, value):
        return value < self.value
 
    def __iter__(self):
        return self
 
    def next(self):
        if self.current > self.value:
            raise StopIteration
        else:
            self.current += 1
            return self.current - 1
 
 
a = MySophisticatedSequence(4)
print 3 in a
print 6 in a
a.append(5)
print 6 in a
for i in a:
    print i

Это хоть и достаточно бессмысленная, но тоже последовательность, в которую можно паковать value1, value2 и т.д. (вытащить обратно будет непросто — это да)

Добавить комментарий
0

key_val = [0, 1, 2], [10, 11, 12]
 
dt = {tuple(kv): kv for kv in key_val}
print(1, dt)
 
key_val[0].append(3)
key_val[-1].pop(-1)
print(2, dt)

1 {(0, 1, 2): [0, 1, 2], (10, 11, 12): [10, 11, 12]}

2 {(0, 1, 2): [0, 1, 2, 3], (10, 11, 12): [10, 11]}

Добавить комментарий
Напишите свой ответ на данный вопрос.
Scroll Up