Home > Back-end >  Python add missing element into list
Python add missing element into list

Time:05-17

I have a list with day of a month as key and i want to add all missing day with 0 as value.

This is a sample :

tab = [{'day':3, 'value':50, 'label': 'Element 1' }, {'day':5, 'value':20, 'label': 'Element 2'},{'day':11, 'value':3, 'label': 'other label'},{'day':15, 'value':5, 'label': 'something'}]

And I looking for something like this :

tab = [{'day':1, 'value':0, 'label': 'some label'}, {'day':2, 'value':0, ‘label': 'something'}, ...,{'day':30, 'value':0, 'label': 'value label'}]

What is the better way to did it.

This is my code :

new_tab = []
for i in range(1, 30):
    if i not in existing_day:
        new_tab.append({'day': i, 'value': 0, 'label':''})
    else:
        elt = [x for x in tab if x['day'] == i]
        new_tab.append(elt[0])

CodePudding user response:

Just loop over the day numbers. With your list of dicts format:

tab = [{'day':3, 'value':50}, {'day':5, 'value':20},{'day':11, 'value':3},{'day':15, 'value':5}]
newtab=[]
for i in range(1,32):
    newtab.append({i: tab[i] if i in tab else 0})

Or (recommended) with the single dict format:

tab = {3:50,5:20,11:3,15:5}
newtab={}
for i in range(1,32):
    newtab[i] = tab[i] if i in tab else 0

CodePudding user response:

You could simply make a run with numbers varying from 1 to 31, and add the mssing parts in there. However, the list of records itself, as is, is bad for retrieving data on a given day: one simply can't do tab[3] to get information on "day 3", which would be O(1), instead one has to perform a search of the whole list, checking each record for r['day'] == 3 which is a linear search.

You can create a class that will act as a mapping for whoever is using it, index the records by day, and return an appropriate default record when there is no data for a given day.

It can be sophisticated, but ultimately, all you need is a class that will create the index as a dictionary, and feature a __getitem__ method:

class TabIndex:
    def __init__(self, tab):
        self.indexed = {record["day"]: record for record in tab}

    def __getitem__(self, index):
        return self.indexed.get(index, {"day": index, "value": 0})

And here is how you can use this, demonstrated on an interactive session:

In [41]: tab = [{'day':3, 'value':50, 'label': 'Element 1' }, {'day':5, 'value':20, 'label': 'Element 2'},{'day':11, 'value':3, 'label': 'other label'},{'day':15, 'value':5, 'label': 'something'}]

In [42]: x= TabIndex(tab)

In [43]: x[20]
Out[43]: {'day': 20, 'value': 0}

In [44]: x[3]
Out[44]: {'day': 3, 'value': 50, 'label': 'Element 1'}

  • Related