Двумерные списки в Python - это просто списки списков.Таким образом, каждый элемент data_list
сам по себе является списком.Вот пример доступа к элементу, первому элементу ниже вашей строки заголовков (таким образом, индекс 1):
>>> first_entry = data_list[1]
>>> first_entry
['Rudolph S', 1500, 3, 0]
Начиная с data_list[1]
(который мы сохранили как переменную с именем first_entry
)это также список, к которому мы можем получить доступ, мы можем получить доступ к четвертому элементу (по индексу 3, поскольку списки начинают индексироваться с 0) первой записи следующим образом:
>>> first_entry = data_list[1]
>>> fourth_element = first_entry[3]
>>> fourth_element
0
Или, более кратко:
>>> data_list[1][3]
0
Итак, чтобы начать отвечать на ваш вопрос, если вашей целью было обновить сумму пожертвования "Joye A"
, вы должны использовать data_list[3][1] = donation_amt
.Это потому, что запись Джой находится в индексе 3 основного списка, а пожертвования записаны в индексе 1 ее подсписка.
К сожалению, это не решит вашу проблему, так как вы хотите выбрать произвольное имядля которого либо создать новую запись, либо обновить существующую запись.Реальный ответ здесь заключается в том, что вы используете неправильную структуру данных.Однако, ради образовательной ценности, я опишу, как вы могли бы сделать это с вашей существующей структурой.
Использование вашей матрицы
Сначала вам нужно будет определить, является ли имяуже существует.В результате было бы лучше создать дополнительный список, который содержит только первый столбец, 1-й список.Вы можете сделать это любым количеством способов.Я покажу это как понимание списка:
>>> names_only = [e[0] for e in data_list]
>>> names_only
['NAMES', 'Rudolph S', 'Josef M', ...]
Я не буду объяснять это здесь, но есть множество потоков, объясняющих, как работает понимание списка для любых читателей, которые не знают.
Сначала вы проверяете, существует ли имя в матрице:
>>> 'Josef M' in names_only
True
Если это так, теперь вам нужно найти индекс искомого имени.Списки в Python имеют функцию индекса:
>>> idx = names_only.index('Joesf M')
>>> idx
2
Теперь вы обновляете его сумму пожертвования, как описано выше:
>>> data_list[idx][1] = donation_amt
Теперь, если его нет в матрице, мы хотимсделать совершенно новый ряд.Давайте представим, что мы обрабатываем пользователя с именем 'bob'
.Он еще не в матрице.Здесь вы используете функцию добавления:
>>> data_list.append([bob, donation_amt, 1, None])
Где 1
и None
могут быть заменены значениями по умолчанию.Собираем все вместе как функцию:
>>> def update_or_create(name, amt):
... names = [e[0] for e in data_list]
... if name in names:
... idx = names.index(name)
... data_list[idx][1] = amt
... else:
... data_list.append([name, amt, 1, None])
Должен делать то, что вы просите.
Наконец
Было бы лучше использовать другую структуру для этого.Я бы предложил структуру dict вроде:
new_structure = {NAME: {'donation': DONATION_AMT, 'num_gifts': NUM_GIFTS, 'avg_amt': AVERAGE_DONATION},...}
Не вдаваясь в подробности, следование этому формату позволит следующей функции выполнить ту же задачу:
>>> def update_or_create(name, amt):
... if name in new_structure:
... new_structure[name]['donation'] = amt
... else:
... new_structure.update({name: {'donation': amt, 'num_gifts': 1, 'avg_amt': None}})
Намного приятнее.