Добавление кортежей в словарь

#python #dictionary #tuples

#python #словарь #кортежи

Вопрос:

В приведенной ниже части я хочу добавить в self.data словарь больше ключа, значения tuples .

Прямо сейчас, когда tuple появляется новый, он идет поверх текущего tuple , и у меня всегда остается самый последний, хотя я хочу сохранить их все.

Есть предложения?

 from datetime import date
from collections import defaultdict


class Budget(object):
    # todo : automatic date pickup

    def __init__(self, amount):
        self.amount = amount
        self.data = defaultdict(list)
        self.budget = None
        self.rem_days = None
        self.payment_dates = ['2019-01-23','2019-02-22','2019-03-22','2019-04-23','2019-05-23','2019-06-22',
                            '2019-07-23','2019-08-23','2019-09-23','2019-10-23','2019-11-22','2019-12-23',]
    def calc_days(self):
        cur_day = date.today().day
        cur_month = date.today().month
        ext_day = int(self.payment_dates[cur_month-1][8:10])
        self.rem_days = ext_day - cur_day 1
        print("Remaining days: ", self.rem_days)

    def daily_budget(self):
        self.budget = int(self.amount)/self.rem_days
        print("Daily budget: ", self.budget)

    def history(self):
        # todo: fill in the dictionary with multiple tuples
        imera = date.today()
        cur_month = date.today().month
        items = [self.rem_days, self.budget]
        self.data[str(imera)].extend(items)
        print (self.data)

inp = input("Insert account balance: ")
while inp != "s":
    budget = Budget(inp)
    budget.calc_days()
    budget.daily_budget()
    budget.history()
    inp = input("Insert account balance or / to stop:")
  

вывод:

 Insert account balance: 54
Remaining days:  18
Daily budget:  3.0
defaultdict(<class 'list'>, {'2019-04-06': [18, 3.0]})
Insert account balance or / to stop: 54
Remaining days:  18
Daily budget:  3.0
defaultdict(<class 'list'>, {'2019-04-06': [18, 3.0]})
Insert account balance or / to stop:
  

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

1. пожалуйста, добавьте пример кода

Ответ №1:

Вы могли бы использовать defaultdict из collections модуля,

Примерный пример:

 >>> from collections import defaultdict
>>> d = defaultdict(list)
>>> d
defaultdict(<class 'list'>, {})
>>> d['foo'].append('bar')
>>> d['foo'].append('baz')
>>> d
defaultdict(<class 'list'>, {'foo': ['bar', 'baz']})
>>> d['foo']
['bar', 'baz']

>>> data = defaultdict(list) 
>>> data["cur_day"].extend(['foo', 'bar'])
>>> data
defaultdict(<class 'list'>, {'cur_day': ['foo', 'bar']})
  

Исправление кода:

 from collections import defaultdict

class SomeClass(Object): # python2 ?

    def __init__(self, amount):
        self.amount = amount
        self.data = defaultdict(list) # defaultdict for storing `data`
        self.budget = None
        self.rem_days = None
        self.payment_dates = ['2019-01-23','2019-02-22','2019-03-22','2019-04- 
                             23','2019-05-23','2019-06-22',
                            '2019-07-23','2019-08-23','2019-09-23','2019-10- 
                             23','2019-11-22','2019-12-23',]     


      def history(self):
        # todo: fill in the dictionary with multiple tuples
        cur_day = date.today().day
        items = (self.rem_days, self.budget) # made the items tuple
        self.data['cur_day'].append(items) # appending data to the `list` in `cur_day` of the `dict` `data`
        #self.data.update([("cur_day", items)])
        print (self.data)
  

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

1. все еще получаю 1 элемент в моем списке: defaultdict(<class ‘list’>, {‘cur_day’: [[18, 2.4444444444444446]]})

2. Ошибка атрибута: объект ‘collections.defaultdict’ не имеет атрибута ‘extend’

3. defaultdict(<список классов»>, {‘2019-04-06’: [18, 0.2777777777777778]}) Вставить баланс учетной записи или / для остановки: 6 Оставшиеся дни: 18 Ежедневный бюджет: 0.33333333333333333 defaultdict(<список классов»>, {‘2019-04-06’: [18, 0.3333333333333333]}) Вставить баланс учетной записи или / для остановки:

4. итак, снова dict не заполняется, он всегда содержит последнее значение self.data

5. Это вызывается 2 раза. Я думаю, это происходит потому, что dict расширяется значениями, которые имеют один и тот же ключ: ‘2019-04-06’, поэтому в итоге у меня всегда есть одна пара ключ-значение, независимо от того, сколько раз я вызываю «метод истории»