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

Python 如何向具有扩展值的多维数组添加项,python,arrays,python-3.x,nested-lists,sublist,Python,Arrays,Python 3.x,Nested Lists,Sublist,我正在处理一个项目,我有一个列表,其中包含名称、货币值等。当用户输入值时,我在尝试更新主列表中的各个子列表时遇到了麻烦 例如,“我的列表”包含4行(常量)和基于用户条目的列数。我将整个计划包括在内,仅供参考,以防对其外观有疑问: spacing = '- ' * 45 # formatting for DONOR header data_list = [['NAMES', 'DONATION AMOUNT', 'Number of Gifts', 'Avg Gifts'],

我正在处理一个项目,我有一个列表,其中包含名称、货币值等。当用户输入值时,我在尝试更新主列表中的各个子列表时遇到了麻烦

例如,“我的列表”包含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)
将附加到主列表中,这意味着如果您有一个类似于您的列表,它将添加到末尾

[['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).

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

3维列表能够添加到主列表或子列表之一

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

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

似乎有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
        }]

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

似乎有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
        }]

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

为了将捐赠金额正确地附加到正确的子列表中,您需要首先确定捐赠者所属列表中的索引。找到索引后,可以将捐赠金额附加到该索引处的子列表中。为此,请更换:

data_list.append(donation_amt) # difficulty HERE
与:


我尝试了这个方法,它对我很有效。

为了将捐赠金额正确地附加到正确的子列表中,您需要首先确定捐赠者所属列表中的索引。找到索引后,可以将捐赠金额附加到该索引处的子列表中。为此,请更换:

data_list.append(donation_amt) # difficulty HERE
与:


我尝试过这个方法,它对我有效。

Python中的二维列表仅仅是列表的列表。因此,
数据列表
的每个元素本身就是一个列表。下面是访问元素的示例,即标题行(因此,索引1)下方的第一个元素:

由于
data\u list[1]
(我们将其存储为一个名为
first\u entry
的变量)也是一个我们可以访问的列表,因此我们可以访问第一个条目的第四个元素(在索引3处,因为列表从0开始索引),如下所示:

>>> first_entry = data_list[1]
>>> fourth_element = first_entry[3]
>>> fourth_element
0
或者更简洁地说:

>>> data_list[1][3]
0
因此,为了开始回答您的问题,如果您的目标是更新
“Joye A”
的捐赠金额,您将使用
数据列表[3][1]=捐赠金额。这是因为Joye的条目位于主列表的索引3处,捐款记录在其子列表的索引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.append([bob, donation_amt, 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])
您现在更新他的捐款金额,如上所述:

>>> data_list[idx][1] = donation_amt
现在,如果他不在矩阵中,我们就要制造一场全新的争吵。假设我们正在处理一个名为
'bob'
的用户。他还没有进入母体。在这里,您可以使用append函数:

>>> idx = names_only.index('Joesf M')
>>> idx
2
>>> data_list.append([bob, donation_amt, 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])
其中
1
None
可以替换为默认值。将其作为一项功能放在一起:

>>> idx = names_only.index('Joesf M')
>>> idx
2
>>> data_list.append([bob, donation_amt, 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}})

更好。

Python中的二维列表仅仅是列表的列表。因此,
数据列表
的每个元素本身就是一个列表。下面是一个访问元素的示例,该元素是行下面的第一个元素