字典仅捕获最后一个键值对Python

时间:2019-02-21 03:06:25

标签: python dictionary

有一个用于名称的字典和一个用于打印字典的函数。问题是,当我运行create_user()函数时,它仅捕获并打印最后一个值。

users={}

def create_users():

    while True:
        choice=input('Create a new user?: Y/N ')
        if(choice=='y'):
           first_name=  input('Enter first name: ')
           users['first_name'] = first_name

           last_name= input('Enter last name: ')
           users['last_name']=last_name

           print(len(users))

        if(choice=='n'):
            print('Exit')
            break

def print_dir():
    print('Directory Item ','\n')
    for k,v in users.items():
        print(k,v)

create_users()
print_dir()

我也在下面尝试过此操作,在此之前和之后捕获。那没有解决。

def create_user():
  first_name=  input('Enter first name: ')
  users['first_name'] = first_name

  last_name= input('Enter last name: ')
  users['last_name']=last_name

  while True:
        choice=input('Create a new user?: Y/N ')
        if(choice=='y'):
           first_name=  input('Enter first name: ')
           users['first_name'] = first_name

           last_name= input('Enter last name: ')
           users['last_name']=last_name 

任何提示/提示如何解决?谢谢

我根据建议尝试的其他项(嵌套词典)

users={}
users['username'] = {}

while True:
        choice=input('Create a new user?: Y/N ')
        if(choice=='y'):
           first_name=  input('Enter first name: ')
           users['username']['first_name'] = first_name

           last_name= input('Enter last name: ')
           users['username']['last_name']=last_name

我仍然遇到无法获取所有值的问题
创建新用户?:是/否y

输入名字:james

输入姓氏:琼斯

创建新用户吗?:是/否

输入名字:rob

输入姓氏:威廉

创建新用户?:是/否n

退出 目录项

用户名{'first_name':'rob','last_name':'william'}

2 个答案:

答案 0 :(得分:0)

users['last_name']=last_name 

您的问题是用户正被用来存储单个用户的数据。您想要的更像是

users[username]['last_name']=last_name 

为用户提供词典字典。在哪里获取用户名取决于您。如果您没有很好的消息来源,那么将用户纳入词典列表可能会更好。

答案 1 :(得分:0)

字典是一个键值对。字典具有唯一的键。因此,当您运行该程序并选择第二次“ y”时,它将更新现有的密钥“ first_name”和“ last_name”。在这种情况下,您字典中没有数据,例如{'first_name':'A','last_name':'B','first_name':'C','last_name':'D'}重复按键。但是,您可以将first_name保存为键,将firstname保存为值。参见下面的代码。

template <auto MEMBER>
struct C
{
    template <class RET, class T, class... ARGS>
    static constexpr auto deduce_RET(RET (T::*member)(ARGS...)) -> RET;
    template <class RET, class T, class... ARGS>
    static constexpr auto deduce_T(RET (T::*member)(ARGS...)) -> T;
    using RET = decltype(deduce_RET(MEMBER));
    using T = decltype(deduce_T(MEMBER));
    template <class... ARGS>
    RET operator()(ARGS&&... args)
    {
        return (reinterpret_cast<T*>(0)->*MEMBER)(std::forward<ARGS>(args)...);
    }
};