Установка значений словаря во время итерации цикла for - PullRequest
0 голосов
/ 02 апреля 2019

Я пытаюсь создать вложенный словарь с набором значений, которые извлекаются из цикла for, чтобы измерить суммы роста и дохода для различных пар клиент-продукт.Однако, когда я перебираю цикл данных для установки элементов словаря, каждый элемент словаря заканчивается одинаковыми значениями.Что здесь происходит?

Я уже пытался изменить различные элементы построения списков, но безрезультатно.

'''
TP_Name = customer name

Service_Level_1 = service name

100.2014 is just a marker to show that someone has started consuming the service

tpdict is already created with necessary nesting below with empty values at each endpoint
'''

for col in pivotdf.columns:
  growthlist = []
  amountlist = []
  first = True
  TP_Name, Service_Level_1 = col.split('___')
  for row in pivotdf[col]:
    if first == True:
      past = row+.00001
      first = False
    if row == 0 and past <.0001 :
      growth = 0
    elif row != 0 and past == .00001:
      growth = 100.2014
    else:
      current = row
      growth = (current-past)/past
    growth = round(growth,4)
    growthlist.append(growth)
    past = row +.00001
    amountlist.append(row)
  tpdict[TP_Name][Service_Level_1]['growth'] = growthlist
  tpdict[TP_Name][Service_Level_1]['amount'] = amountlist

'''
problem: Each value ends up being the same thing
'''

Expected results:

{'CUSTOMER NAME': {'PRODUCT1': {'growth': [unique_growthlist],   'amount': [unique_amountlist]},  'PRODUCT2': {'growth': [unique_growthlist],'amount': [unique_amountlist]}}}

1 Ответ

0 голосов
/ 02 апреля 2019

Словарь - это пара ключ-значение (как, я уверен, вы знаете).Если вы когда-нибудь попытаетесь записать в словарь ключ, который уже существует в словаре, то словарь перезапишет значение для этого ключа.

Пример:

d = dict()
d[1] = 'a' # d = {1: 'a'}
d[1] = 'b' # d = {1: 'b'}

Ваш проект может показаться хорошим вариантом использования namedtuple в Python.A namedtuple - это в основном легкий класс / объект.Мой пример кода может быть неправильным, потому что я не знаю, как работает ваш цикл for (комментирование помогает всем).То, что здесь сказано, является примером.

Я даю эту рекомендацию только потому, что dictionaries потребляет на 33% больше памяти, чем объекты, которые они содержат (хотя они гораздо быстрее).

from collections import namedtuple

Customer = namedtuple('Customer', 'name products')
Product = namedtuple('Product', 'growth amount')

customers = []
for col in pivotdf.columns:
    products = []
    growthlist = []
    amountlist = []
    first = True
    TP_Name, Service_Level_1 = col.split('___')
    for row in pivotdf[col]:
        if first == True:
            past = row + .00001
            first = False
        if row == 0 and past < .0001 :
            growth = 0
        elif row != 0 and past == .00001:
            growth = 100.2014
        else:
            current = row
            growth = (current - past) / past
        growth = round(growth, 4)
        growthlist.append(growth)
        past = row + .00001
        amountlist.append(row)

    cur_product = Product(growth=growthlist, amount=amountlist) # Create a new product
    products.append(cur_product) # Add that product to our customer

# Create a new customer with our products
cur_customer = Customer(name=TP_Name, products=products)
customers.append(cur_customer) # Add our customer to our list of customers

Здесь customers - это список клиентов namedtuples, которые мы можем использовать в качестве объектов.Например, вот как мы можем их распечатать.

for customer in customers:
    print(customer.name, customer.products) # Print each name and their products
    for growth, amount in customer.products:
        print(growth, amount) # Print growth and amount for each product.
...