【问题标题】:Why am I getting dict_values instead of str?为什么我得到 dict_values 而不是 str?
【发布时间】:2021-03-04 09:17:30
【问题描述】:

我有以下初始变量:

secret = {"password": "jdksal",
          "user": "fjdklas",
          "schema": "jfdaskl"}
pass_words = ['password', 'pass', 'contraseña']
user_words = ['user', 'login', 'username']

如果秘密字典包含任何列表中的密钥,我想分配变量。所以我会运行这个命令(从How to get value from dict if its key can have several values获得):

password, user={k:v for k,v in secret.items() if k in pass_words+user_words}.values()

它运行良好,我将passworduser 作为字符串。但是,如果我只对一个变量做同样的事情,比如:

password ={k:v for k,v in secret.items() if k in pass_words}.values()

我得到password 作为类型dict_values。这是为什么呢?

【问题讨论】:

  • 因为.values() 在字典上调用返回dict_values。你为什么期待一个字符串?
  • .values() 的返回类型没有改变,但您已经改变了存储它的方式。
  • 您第一次使用password, user = ... 似乎过于复杂;我不太确定你想在那里做什么,但肯定不清楚,应该做得更简单。一旦这样做,您的实际问题也可能会得到解决。
  • 你没有得到字符串:你得到的是dict_values。你可以解包,这就是你在第一个例子中所做的:你自动将dict_values解包成密码和用户。 如果存在第三个值(例如,架构也包含在内),您会收到错误消息:ValueError: too many values to unpack (expected 2)。因此,在您的工作示例中,您或多或少是“幸运的”。
  • 我认为您的链接问题中接受的答案太复杂了;考虑下面 Amir 的回答,它消除了整个 .values() 的东西,并使事情变得更简单、更容易阅读。

标签: python dictionary dictionary-comprehension


【解决方案1】:

你第一次使用

password, user={k:v for k,v in secret.items() if k in pass_words+user_words}.values()

之所以有效,是因为偶然字典中恰好有两个项目,并且偶然它们以正确的顺序排列。即,如果您将 secret 更改为

secret = {"user": "fjdklas",
          "password": "jdksal"}

它不再起作用了。

更好的方法是这样的:

users_and_passwords = [v for k,v in secret.items() if k in pass_words+user_words]
passwords = [v for k,v in secret.items() if k in pass_words]

【讨论】:

    【解决方案2】:

    在dict上调用values()返回dict_values,在你的代码中,结果中正好有两个元素,等号左边,三个是两个变量,如果只有一个变量在左边,则自动解包等号,它不会解包

    password, user=
    

    你的代码不合理, user_words = ['user', 'login', 'username', 'schema'],修改 user_words ,再运行你的代码,你会发现错误

    【讨论】:

      相关资源