我在一个项目上工作,我有一个包含名称、货币值等的列表列表。当用户输入值时,我在尝试更新主列表中的各个子列表时遇到了麻烦。你知道吗
例如,我的列表包含4行(常量)和基于用户条目的列数。我把整个计划都包括进来只是为了参考,以防大家对它的样子有疑问:
spacing = '- ' * 45 # formatting for DONOR header
data_list = [['NAMES', 'DONATION AMOUNT', 'Number of Gifts', 'Avg Gifts'],
['Rudolph S', 1500, 3, 0],
['Josef M', 250, 5, 0],
['Joye A', 5000, 2, None],
['Joni M', 2750, 1, None],
['Rachelle L', 750, 3, None],
['Vena U', 1000, 7, None],
['Efrain L', 10000, 1, None],
['Mee H', 15000, 2, None],
['Tanya E', 50000, 1, None],
['Garrett H', 800, 2, None]]
def addtolist():
"""Method for sending 'Thank You' messages to Donors, using names *"""
while True:
print("Enter the name of the person you are writing to (or enter 'list' to see a list of names or Q to quit) ")
fname_prompt = input("First Name: ").strip().capitalize()
if fname_prompt.upper() == "Q":
break
elif fname_prompt.lower() == "list":
if len(data_list) - 1 % 2 != 0:
for i in range(0, int(len(data_list) - 1 / 2)):
cut_off = int((len(data_list)) / 2)
if i == 0:
print(spacing)
print('{:>44s}'.format(str(data_list[i][0])))
print(spacing)
elif cut_off + i >= len(data_list):
continue
else:
print('{:>30s}'.format(data_list[i][0]), '{:>35s}'.format(data_list[cut_off + i][0]))
else:
if i == 0:
print(spacing)
print('{:>20s}'.format(str(data_list[i])))
print(spacing)
else:
print('{:>15s}'.format(data_list[i][0]), '{:>30s}'.format(data_list[cut_off + i][0]))
else:
lname_prompt = input("Last Name: ").strip().capitalize()
if lname_prompt.upper() == "Q":
break
elif lname_prompt.lower() == "list":
if len(data_list) - 1 % 2 != 0:
for i in range(0, int(len(data_list) - 1 / 2)):
cut_off = int((len(data_list)) / 2)
if i == 0:
print(spacing)
print('{:>44s}'.format(str(data_list[i][0])))
print(spacing)
elif cut_off + i >= len(data_list):
continue
else:
print('{:>30s}'.format(data_list[i][0]), '{:>35s}'.format(data_list[cut_off + i][0]))
else:
if i == 0: # for each item in list / 2 (5 x)
print(spacing)
print('{:>20s}'.format(str(data_list[i][0])))
print(spacing)
else:
print('{:>15s}'.format(data_list[i][0]), '{:>30s}'.format(data_list[cut_off + i][0]))
else:
full_name = fname_prompt + " " + lname_prompt
if full_name != "List List" or full_name != "list ":
name_found = False
for vals in data_list:
if full_name in vals:
name_found = True
else:
name_found = False
if name_found is False:
add_name = input("That name is not in the Donor list. Do you want to add it to the list? ").upper()
if add_name == "Y":
data_list.append([full_name])
if len(data_list) - 1 % 2 != 0:
for i in range(0, int(len(data_list) - (len(data_list) - 2) / 2)):
cut_off = int((len(data_list)) / 2)
if i == 0:
print(spacing)
print('{:>44s}'.format(str(data_list[i][0])))
print(spacing)
elif cut_off + i >= len(data_list):
print('{:>30s}'.format(data_list[i][0]))
continue
else:
print('{:>30s}'.format(data_list[i][0]), '{:>35s}'.format(data_list[cut_off + i][0]))
else:
if i == 0: # for each item in list / 2 (5 x)
print(spacing)
print('{:>20s}'.format(str(data_list[i][0])))
print(spacing)
else:
print('{:>15s}'.format(data_list[i][0]), '{:>30s}'.format(data_list[cut_off + i][0]))
donation_amt = int(input("Enter in the donation amount from Donor {0}: $".format(full_name)))
print('{0} has donated ${1}'.format(full_name, donation_amt))
data_list.append(donation_amt) # difficulty HERE
print(data_list)
我遇到的主要问题是在最后加了一句话“这里很难”。你知道吗
data_list.append(donation_amt) # difficulty HERE
我正在尝试这样做,当用户输入一个新的名称和新的捐赠金额(或者如果他们只是选择一个现有的名称并附加一个捐赠金额),程序可以附加/插入货币价值到相关的子列表(它附加到的名称)。我现在设置它的方式只是将数值附加到较大列表的末尾,但是我没有成功地将值附加到子列表中。。。以前有人做过这样的事吗?你知道吗
似乎有4个静态列和不确定的行数。你知道吗
你考虑过使用字典列表,比如json文档吗?你知道吗
等等。我认为,如果可以引用各个键并更新它们的值,而不是使用列表和索引值,那么处理数据可能会更容易。你知道吗
Python中的二维列表仅仅是列表的列表。因此,
data_list
的每个元素本身就是一个列表。下面是访问元素的示例,即标题行下面的第一个元素(因此,索引1):由于
data_list[1]
(我们将其存储为一个名为first_entry
的变量)也是我们可以访问的列表,因此我们可以访问第一个条目的第四个元素(在索引3处,因为列表从0开始索引),如下所示:或者,更简洁地说:
所以,要开始回答你的问题,如果你的目标是更新
"Joye A"
的捐赠金额,你应该使用data_list[3][1] = donation_amt
。这是因为Joye的条目位于主列表的索引3处,捐款记录在其子列表的索引1处。你知道吗不幸的是,这并不能真正解决您的问题,因为您希望使用任意名称来创建新条目或更新现有条目。这里真正的答案是您使用了错误的数据结构。不过,出于教育价值的考虑,我将继续介绍如何利用现有结构实现这一点。你知道吗
使用矩阵
首先,您需要确定名称是否已经存在。因此,最好创建一个只包含第一列的额外列表,即1-d列表。你可以用很多方法来做。我将以列表形式显示:
我不会在这里解释这一点,但是有很多线索解释列表理解是如何为那些不知道的读者工作的。你知道吗
首先,检查该名称是否已存在于矩阵中:
如果是这样,您现在需要找到您要查找的名称的索引。Python中的列表有一个索引函数:
您现在更新他的捐赠金额,如上所述:
现在,如果他不在矩阵中,我们就要重新开始。假设我们正在处理一个名为
'bob'
的用户。他还没有进入母体。这里使用append函数:其中
1
和None
可以替换为任何默认值。将其作为一个函数:你要做什么就做什么。你知道吗
最后
最好使用不同的结构。我会提出一个dict结构,比如:
无需太多细节,遵循此格式将允许以下函数执行相同的任务:
好多了。你知道吗
三维列表可以添加到主列表或子列表中。你知道吗
会附加到主列表,这意味着如果你有一个像你这样的列表,它会添加到最后。你知道吗
如果要将捐赠金额添加到特定索引中,请使用
请让我知道如果这不起作用,或者如果你想要一个更好的解释,那么它可能是一个不同的问题。你知道吗
相关问题 更多 >
编程相关推荐