larrywgray
larrywgray

Reputation: 1023

Appending to List within a Dictionary

Objective: Append items from value['itemArray'] to Products['Items'] - see function fba_orders

Problem: The Current code only appends the last item of value['itemArray'] to Products['Items']

Current Output:

{'Items': [{'SellerFulfillmentOrderItemId': 266804219, 'SellerSKU': 'IX-GZ31-31K6', 'Quantity': 1}, {'SellerFulfillmentOrderItemId': 266804219, 'SellerSKU': 'IX-GZ31-31K6', 'Quantity': 1}]}

Correct Output would be:

{'Items': [{'SellerFulfillmentOrderItemId': 266804218, 'SellerSKU': 'KM-090914-840-BEARLAPTOP', 'Quantity': 1}, {'SellerFulfillmentOrderItemId': 266804219, 'SellerSKU': 'IX-GZ31-31K6', 'Quantity': 1}]}

Code:

import sys

VALUE = {'amountPaid': '43.38',
 'amountSaved': 0.0,
 'buyerCheckoutMessage': '',
 'buyerUserID': 13182254,
 'buyerUserName': 'W5Tiny',
 'checkoutStatus': {'status': 'Complete'},
 'createdTime': '2015-06-30T22:41:01Z',
 'creatingUserRole': 'Buyer',
 'itemArray': [{'item': {'itemID': 266804218,
    'price': '21.1',
    'quantity': 1,
    'sellerInventoryID': 'KM-090914-840-BEARLAPTOP',
    'sk': 'KM-090914-840-BEARLAPTOP',
    'title': u"VTech Bear's Baby Laptop, Blue [Toy]"}},
  {'item': {'itemID': 266804219,
    'price': '22.28',
    'quantity': 1,
    'sellerInventoryID': 'IX-GZ31-31K6',
    'sk': 'IX-GZ31-31K6',
     'title': 'Toy State Caterpillar Push Powered Rev It Up Dump Truck     [Toy]'}}],
 'orderID': 34013525,
 'orderStatus': 'Completed',
 'paidTime': '2015-06-30T22:50:38Z',
 'shippingAddress': {'addressID': 15798541,
  'cityName': 'Nashville',
  'country': 'US',
  'countryName': None,
  'name': 'UNKNOWN',
  'postalCode': '37221',
  'stateOrProvince': 'TN',
  'street1': '123 BOOGIE DRIVE',
  'street2': None},
 'shippingDetails': {'amount': '0.0',
  'insuranceFee': 0,
  'servicesArray': [],
  'shippingService': 'Standard shipping'},
 'subtotal': 43.38,
 'taxAmount': 0.0,
 'total': '43.38',
 'transactionArray': {'transaction': {'buyer': {'email':   '[email protected]'},
   'finalValueFee': '0.0',
   'providerID': '11V84334FD304010L',
   'providerName': 'Paypal'}}}


def fba_order():
    address = {}
    products = {'Items': []}
    item = {}
    Items = []
    address['City'] = VALUE['shippingAddress']['cityName']
    address['CountryCode'] = VALUE['shippingAddress']['country']
    address['Line1'] = VALUE['shippingAddress']['street1']
    address['Line2'] = VALUE['shippingAddress']['street2']
    address['Name'] = VALUE['shippingAddress']['name']
    address['PostalCode'] = VALUE['shippingAddress']['postalCode']
    address['StateOrProvinceCode'] = VALUE['shippingAddress']['stateOrProvince']
    for items in VALUE['itemArray']:
        item['Quantity'] = items['item']['quantity']
        item['SellerFulfillmentOrderItemId'] = items['item']['itemID']
        item['SellerSKU'] = items['item']['sk']
        products['Items'].append(item)
        continue
    print address, '\n', products

if __name__ == '__main__':
    sys.exit(fba_order())

Upvotes: 2

Views: 572

Answers (2)

Anand S Kumar
Anand S Kumar

Reputation: 91009

The issue is that you are creating item outside the for loop and then just changing the values inside the for loop and appending it to the list.

dictionaries are reference, and hence even after appending to products['Items'] list if you change the item dictionary it will make changes to the item that was appended to the list.

You want to initialize item to a new dictionary inside the for loop.

Example -

def fba_order():
    address = {}
    products = {'Items': []}
    Items = []
    address['City'] = VALUE['shippingAddress']['cityName']
    address['CountryCode'] = VALUE['shippingAddress']['country']
    address['Line1'] = VALUE['shippingAddress']['street1']
    address['Line2'] = VALUE['shippingAddress']['street2']
    address['Name'] = VALUE['shippingAddress']['name']
    address['PostalCode'] = VALUE['shippingAddress']['postalCode']
    address['StateOrProvinceCode'] = VALUE['shippingAddress']['stateOrProvince']
    for items in VALUE['itemArray']:
        item = {}
        item['Quantity'] = items['item']['quantity']
        item['SellerFulfillmentOrderItemId'] = items['item']['itemID']
        item['SellerSKU'] = items['item']['sk']
        products['Items'].append(item)
        continue
    print address, '\n', products

Upvotes: 3

Martijn Pieters
Martijn Pieters

Reputation: 1124798

You are reusing the dictionary referenced by item over and over again; appending this one dictionary won't create a new copy. Rather, you are adding multiple references to that one dictionary. As you continue to alter the dictionary all those references will show those changes.

Better produce an entirely new dictionary for each loop iteration:

for items in VALUE['itemArray']:
    item = {
        'Quantity': items['item']['quantity'],
        'SellerFulfillmentOrderItemId': items['item']['itemID']
        'SellerSKU': items['item']['sk'],
    }
    products['Items'].append(item)

Upvotes: 3

Related Questions