【问题标题】:Accessing dictionary elements and concatenating with String and print访问字典元素并与 String 和 print 连接
【发布时间】:2020-07-30 15:37:26
【问题描述】:

我已经开始学习python了。在这段代码中,我试图打印输入用户的出生日期以及他/她的名字。我正在使用字典来实现此功能。下面是我的代码sn-p

n=input("Enter Name: ")
    def birth():
        dict1={{"name":"X","birthdate":"16-June-1989"},{"name":"Y","birthdate":"23-08-1990"}}
        if dict1["name"]==n:
            print(dict1["name"]+"'s birth was on " +dict1["birthdate"])
        else:
            print("Not in database")
    birth()

输入 X 时,我的预期输出应如下所示:

X's birthdate was on 16-June-1989

但是我遇到了错误,我尝试了在线搜索,但我想了解我在这里缺少什么。我相信我会得到很多cmets。但我也相信很多人会提供建设性的学习建议。

  File "main.py", line 8, in <module>                                                                                   
    birth()                                                                                                             
  File "main.py", line 3, in birth                                                                                      
    dict1={{"name":"X","birthdate":"16-June-1989"},{"name":"Y","birthdate":"23-08-1990"}}                               
TypeError: unhashable type: 'dict'

【问题讨论】:

  • 不是答案,但在你的情况下,像{'X':16-June-1989,'Y':23-08-1990} 这样的字典不是更有意义吗?
  • 我看到很多这样的例子,但我不想用它来格式化我的打印语句

标签: python python-3.x


【解决方案1】:

你得到错误是因为字典变量 dict1 不能解析它自己的元素,所以你需要创建一个变量/对象来解析字典的元素,这是通过解析变量 p 完成的

n=input("Enter name: ")
def birth(n):  
        dict1=[{"name":"X","birthdate":"16-June-1989"},{"name":"Y","birthdate":"23-08-1990"}] 
        for p in dict1: 
            if p["name"]==n: 
               print(p["name"]+"'s birth was on " +p["birthdate"])
               break;
            else: 
                print("Not in database")
                break;
birth(n)

【讨论】:

    【解决方案2】:

    您定义dict1 的方式不正确。应该是这样的:

    In [1131]: def birth(n): 
          ...:         #dict1={{"name":"X","birthdate":"16-June-1989"},{"name":"Y","birthdate":"23-08-1990"}} 
          ...:         dict1=[{"name":"X","birthdate":"16-June-1989"},{"name":"Y","birthdate":"23-08-1990"}] 
          ...:         for d in dict1: 
          ...:             if d["name"]==n: 
          ...:                 print(d["name"]+"'s birth was on " +d["birthdate"]) 
          ...:             else: 
          ...:                 print("Not in database") 
          ...:                                                                                                                                                                                                  
    
    In [1132]: birth(n)                                                                                                                                                                                         
    X's birth was on 16-June-1989
    

    此外,如果您将用户输入n 作为参数传递给您的函数birth,这将更有意义。然后调用birth(n)之类的方法。

    否则,该方法与名为n 的变量紧密耦合。

    【讨论】:

    • 嗨@Mayank,感谢您的建议。但我觉得答案与我的代码比其他任何人都更相关。此外,您的代码提供的输出次数与字典中的元素数量一样多,因为它在 else 条件下进行验证,反之亦然
    【解决方案3】:

    那是因为你有一个错误的 dict 初始化。 在 python 3+ 中,大括号不仅用于 dict 文字,还用于 set 文字。您可以在此question 获取更多信息。

    例如:

    # that will be a dict:
    d = {"name": "My name", "birthdate": "16-June-1989"}
    
    # and that will be a set:
    d = {"name", "birthdate"}
    
    # your line 3 has set initialization, which contains 2 dicts of user info:
    dict1={{"name":"X","birthdate":"16-June-1989"},{"name":"Y","birthdate":"23-08-1990"}}
    

    还有一个问题,Python 集合中必须只包含可散列的元素,而 dict 是不可散列的。这是explanation

    因此,您应该将您的 dict1 变量类型更改为列表或元组。如果您需要更多关于列表、集合和元组之间区别的信息,这里是 python documentation 关于数据结构的链接。

    您的函数还会为数据库中的每个条目打印一些内容。我认为你只需要在函数执行后打印 1 次。

    所以你的函数应该是这样的:

    def birth(name):
        database = [{"name": "X", "birthdate": "16-June-1989"},
                    {"name": "Y", "birthdate": "23-08-1990"}]
        found = False
        for entry in database:
            if entry["name"] == name:
                print(entry["name"] + "'s birth was on " + entry["birthdate"])
                found = True
                break
        if not found:
            print("Not in database")
    
    
    birth('X')
    # Will print: X's birth was on 16-June-1989
    birth('My name is')
    # Will print: Not in database
    

    【讨论】:

      【解决方案4】:

      确保您的字典定义正确。它应该具有以下形式:

      thisdict = {
        "brand": "Ford",
        "model": "Mustang",
        "year": 1964
      }
      

      您不能将字典用作字典中的键。

      来自 Python 文档:

      字典由键索引,可以是任何不可变类型;字符串和数字总是可以作为键。如果元组仅包含字符串、数字或元组,则元组可以用作键;如果元组直接或间接包含任何可变对象,则不能将其用作键。您不能将列表用作键,因为可以使用索引分配、切片分配或 append() 和 extend() 等方法来修改列表。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-08-15
        • 2015-02-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-23
        相关资源
        最近更新 更多