【问题标题】:Add values to dictionary key using loop使用循环将值添加到字典键
【发布时间】:2018-02-02 14:52:54
【问题描述】:

我有一个来自以下类型的大型数据库:

data = {
    "2": {"overall": 172, "buy": 172, "name": "ben", "id": 2, "sell": 172},
    "3": {"overall": 173, "buy": 173, "name": "dan", "id": 3, "sell": 173},
    "4": {"overall": 174, "buy": 174, "name": "josh", "id": 4, "sell": 174},
    ...

以此类推,大约 10k 行。

然后,我创建了一个循环来查找此 dict() 中是否有特定名称: 我使用了下一个循环

items = ["ben","josh"]

Database = dict()
Database = {"Buying_Price": "", "Selling_Price": ""}
for masterkey, mastervalue in data.items():
    if mastervalue['name'] in items:
        Database["Name"] = Database["Name"].append(mastervalue['name'])
        Database["Buying_Price"] = Database["Buying_Price"].append(mastervalue['buy'])
        Database["Selling_Price"] = Database["Selling_Price"].append(mastervalue['sell'])

但是,我遇到了下一个错误:

Database["Buying_Price"] = Database["Buying_Price"].append(mastervalue['buy_average'])
AttributeError: 'str' object has no attribute 'append'

我的目标是获得一个带有 2 个键的 dict names 数据库:Buying_Price,Selling_Price,其中每个我将拥有以下内容:

Buying_Price = {"ben":172,"josh":174}
Sellng_Price = {"ben":172,"josh":174}

谢谢。

【问题讨论】:

  • 我很困惑。您的程序是否在运行时没有崩溃并产生错误的结果(“只有最后一项的值与 'josh' 一样”)?还是它崩溃并且没有产生任何结果(“我收到下一个错误”)?或者......两者,不知何故?你有没有尝试过 - 除了你不向我们展示?
  • 看起来你正在......试图将一个字符串“附加”到另一个字符串! [正如错误所说],你能指定你想要的输出吗?
  • 您的代码有很多问题,但是您在帖子中所指的是您已将Database["Buying_Price"] 定义为字符串并且字符串对象没有.append() 方法,只有列表可以。
  • 有什么建议那么如何获得我正在寻找的结果?
  • @Ben 你在找什么结果?

标签: python loops dictionary


【解决方案1】:

您发布的代码存在几个问题,因此我们将逐行修复它们:

items = ["ben", "josh"]

Database = dict()
Database = {"Buying_Price": "", "Selling_Price": ""}
for masterkey, mastervalue in data.items():
    if mastervalue['name'] in items:
        Database["Name"] = Database["Name"].append(mastervalue['name'])
        Database["Buying_Price"] = Database["Buying_Price"].append(mastervalue['buy_average'])
        Database["Selling_Price"] = Database["Selling_Price"].append(mastervalue['sell_average'])
  1. 在 Python 中,不需要定义对象类型 明确地然后分配它的值,所以这意味着 Database = dict() 是多余的,因为您已经将其定义为 字典下面的行。
  2. 您打算汇总if 语句的结果 所以Buying_PriceSelling_Price 都应该定义为列表而不是字符串。您可以通过分配一个[] 来做到这一点 值或文字 list()
  3. 根据您的数据结构,您没有 buy_averagesell_average 键,仅限 buysell,因此请确保使用正确的键。
  4. 在使用 append() 方法,它是对象的方法,所以它会就地更新对象。
  5. 您没有在Name 对象中设置Name 的内容,并且 但您正在尝试向其附加值。

总体来说,代码大致应该是这样的:

items = ["ben","josh"]

Database = {"Buying_Price": [], "Selling_Price": [], "Name": []}
for masterkey, mastervalue in data.items():
    if mastervalue['name'] in items:
        Database["Name"].append(mastervalue['name'])
        Database["Buying_Price"].append(mastervalue['buy'])
        Database["Selling_Price"].append(mastervalue['sell'])

【讨论】:

    【解决方案2】:

    听起来你想要一个嵌套的dict

    items = ["ben", "josh"]
    
    new_database = {"Buying_Price": {}, "Selling_Price": {}}
    
    for key, row in data.items():
        name = row["name"]
    
        if name in items:
            new_database["Buying_Price"][name] = row["buy"]
            new_database["Selling_Price"][name] = row["sell"]
    

    【讨论】:

      【解决方案3】:

      Database = {"Buying_Price": "", "Selling_Price": ""} 中,您将键Buying_Price 定义为"":表示字符串。您正在尝试将.append() 列表方法用于字符串,因此出现错误'str' object has no attribute 'append'

      我们不知道你想要的输出,但是看看你想如何计算你的数据,我建议你这样做:

      Database = {"Name" : [], "Buying_Price": [], "Selling_Price": []}
      

      而不是原来的...

      Database = {"Buying_Price": "", "Selling_Price": ""}
      

      这样,您将能够同时追加数据NameBuying_PriceSelling_Price,您将能够使用索引搜索和访问所有数组的数据只有一个。


      我没有注意,但是您将数据附加到您的字典中很糟糕。

      .append() 将工作就地,这意味着你应该这样做:

      Database["Name"].append(mastervalue['name'])
      

      而不是

      Database["Name"] = Database["Name"].append(mastervalue['name'])
      

      【讨论】:

      • 然后我得到:Database["Buying_Price"] = Database["Buying_Price"].append(mastervalue['buy']) AttributeError: 'NoneType' object has no attribute 'append'
      • 是的,因为.append() 返回None。从这些语句中删除分配
      猜你喜欢
      • 2020-05-05
      • 1970-01-01
      • 2019-05-02
      • 2020-01-27
      • 2016-05-15
      • 2015-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多