Home > Software engineering >  Can I loop an array inside a dictionary definition in python?
Can I loop an array inside a dictionary definition in python?

Time:11-24

I'm trying to push data to Firebase and I was able to loop through an array and push the information on each loop. But I need to add some pictures in this (So it'd be like looping an array inside a dictionary definition). I have all the links in an array. This is my code so far.

def image_upload():
for i in range(len(excel.name)):
    doc_ref = db.collection('plans').document('doc-name').collection('collection-name').document()
    doc_id = doc_ref.id
    data = {
        'bedroomLocation': excel.bedroomLocation[i],
        'bedrooms': excel.bedrooms[i],
        'brand': excel.brand[i],
        'catalog': excel.catalog[i],
        'category': excel.category[i],
        'code': excel.code[i],
        'depth': excel.depth[i],
        'description': excel.description[i],
        'fullBaths': excel.fullBaths[i],
        'garage': excel.garage[i],
        'garageBays': excel.garageBays[i],
        'garageLocation': excel.garageLocation[i],
        'garageType': excel.garageType[i],
        'date': firestore.SERVER_TIMESTAMP,
        'id': doc_id,
        'halfBaths': excel.halfBaths[i],
        'laundryLocation': excel.laundryLocation[i],
        'name': excel.name[i],
        'onCreated': excel.onCreated[i],
        'productType': excel.productType[i],
        'region': excel.region[i],
        'sqf': excel.sqf[i],
        'state': excel.state[i],
        'stories': excel.stories[i],
        'tags': [excel.tags[i]],
        'width': excel.width[i],
    }
    doc_ref.set(data)

That works fine, but I don't really know how to loop through the array of links. This is what I tried below the block I copied above.

for j in range(len(excel.gallery)):
    if len(excel.gallery[j]) != 0:
        for k in range(len(excel.gallery[j])):
            data['gallery'] = firestore.ArrayUnion(
                [{'name': excel.gallery[j][k][0], 'type': excel.gallery[j][k][1],
                  'url': excel.gallery[j][k][2]}])
            print(data)
doc_ref.set(data)

len(excel.gallery) has the same length as len(excel.name) each j position has different amount of links though. If I declare the gallery inside the data definition and I use ArrayUnion and pre define more than one piece of information it works fine, but I need to use that array to push information to Firebase.

CodePudding user response:

I'm a little confused by when you say, "I have all the links in an array". Could we see that array and what kind of output you are looking for?

Also assuming that excel.gallery is a dictionary you could clean up your code substantially using the items() function.

for j, k in excel.gallery.items():
    if k:
        data['gallery'] = firestore.ArrayUnion([{'name': k[0], 'type': k[1], 'url': k[2]}])
        print(data)

doc_ref.set(data)

CodePudding user response:

excel.gallery is a matrix actually, is not a dictionary. And this is one of the example outputs for this [[['Images/CFK_0004-Craftmark_Oakmont_Elevation_1.jpeg', 'Elevation', 'url example from firebase'], .... and it goes on for each file. I'm testing with 8 images and 2 plans. So my matrix is 2x4 in this case. But it can happen that in a position there won't be any files if none match. What I'm looking for is add to the data before it is pushed (or after it doesn't matter the order) all the urls for that plan.

This works:

'gallery': firestore.ArrayUnion(
            [{'name': 'Example Name', 'type': 'Elevation',
              'url': 'Example url'},
             {'name': 'Example Name2', 'type': 'First Floor',
              'url': 'Example url2'}])

But I need to populate that field looping through excel.gallery

  • Related