如何向具有扩展值的多维数组中添加项

2024-04-29 13:50:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我在一个项目上工作,我有一个包含名称、货币值等的列表列表。当用户输入值时,我在尝试更新主列表中的各个子列表时遇到了麻烦。你知道吗

例如,我的列表包含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

我正在尝试这样做,当用户输入一个新的名称和新的捐赠金额(或者如果他们只是选择一个现有的名称并附加一个捐赠金额),程序可以附加/插入货币价值到相关的子列表(它附加到的名称)。我现在设置它的方式只是将数值附加到较大列表的末尾,但是我没有成功地将值附加到子列表中。。。以前有人做过这样的事吗?你知道吗


Tags: nameinnoneformat列表fordatalen
3条回答

似乎有4个静态列和不确定的行数。你知道吗

你考虑过使用字典列表,比如json文档吗?你知道吗

    data_list = [{
            'NAME':'Rudolph S',
            'DONATION AMOUNT' : 1500,
            'Number of Gifts' : 3,
            'Avg Gifts' :  0
        },{
            'NAME':'Josef M',
            'DONATION AMOUNT' : 250,
            'Number of Gifts' : 5,
            'Avg Gifts' :  None
        }]

等等。我认为,如果可以引用各个键并更新它们的值,而不是使用列表和索引值,那么处理数据可能会更容易。你知道吗

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。这是因为Joye的条目位于主列表的索引3处,捐款记录在其子列表的索引1处。你知道吗

不幸的是,这并不能真正解决您的问题,因为您希望使用任意名称来创建新条目或更新现有条目。这里真正的答案是您使用了错误的数据结构。不过,出于教育价值的考虑,我将继续介绍如何利用现有结构实现这一点。你知道吗

使用矩阵

首先,您需要确定名称是否已经存在。因此,最好创建一个只包含第一列的额外列表,即1-d列表。你可以用很多方法来做。我将以列表形式显示:

>>> 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'的用户。他还没有进入母体。这里使用append函数:

>>> data_list.append([bob, donation_amt, 1, None])

其中1None可以替换为任何默认值。将其作为一个函数:

>>> 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}})

好多了。你知道吗

三维列表可以添加到主列表或子列表中。你知道吗

data_list.append(donation_amt)

会附加到主列表,这意味着如果你有一个像你这样的列表,它会添加到最后。你知道吗

[['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],
      [donation_amt]]

如果要将捐赠金额添加到特定索引中,请使用

data_list[index].append(donation_amt).

请让我知道如果这不起作用,或者如果你想要一个更好的解释,那么它可能是一个不同的问题。你知道吗

相关问题 更多 >