У меня есть список с днем месяца в качестве ключа, и я хочу добавить все недостающие дни с 0 в качестве значения.
Это образец:
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'}]
И я ищу что-то вроде этого:
tab = [{'day':1, 'value':0, 'label': 'some label'}, {'day':2, 'value':0, ‘label': 'something'}, ...,{'day':30, 'value':0, 'label': 'value label'}]
Как лучше это сделать.
Это мой код:
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])
Как @JohnGordon? Могу ли я получить пример
{3:50, 5:20, 11:3, 15:5}
@PranavHosangadi я обновил свой вопрос и добавил свой код
Просто прокрутите числа дней. С вашим list
из dict
s форматом:
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})
Или (рекомендуется) с одним форматом dict
:
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
Первый пример кода не будет работать. if i in tab
всегда будет ложным, потому что tab
(напрямую) не содержит целых чисел.
Спасибо за решение, но в dict больше двух ключей. Я буду искать, смогу ли я избежать цикла for. Но похоже, что это возможно.
@JohnGordon Да, это работает. tab
в данном случае это словарь
Я говорил о первом примере кода, где tab
— это список.
Вы можете просто выполнить прогон с числами от 1 до 31 и добавить туда части с mssing.
Однако сам список записей плохо подходит для извлечения данных за определенный день: просто невозможно tab[3]
получить информацию о «дне 3», который будет равен O(1), вместо этого нужно выполнить поиск по всему списку с проверкой каждой записи на r['day'] == 3
, что является линейным поиском.
Вы можете создать класс, который будет действовать как сопоставление для тех, кто его использует, индексировать записи по дням и возвращать соответствующую запись по умолчанию, когда для данного дня нет данных.
Это может быть сложно, но в конечном итоге все, что вам нужно, — это класс, который создаст индекс как словарь и будет иметь метод __getitem__
:
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})
А вот как вы можете это использовать, продемонстрировано на интерактивном сеансе:
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'}
Если каждый словарь имеет уникальное значение для
day
, то кажется, что вы можете использовать один словарь. Использование списка из множества диктов делает его намного более неудобным.