【问题标题】:How do I extract specific values from an OrderedDict?如何从 OrderedDict 中提取特定值?
【发布时间】:2020-07-17 18:23:07
【问题描述】:

我喜欢提取特定的键并将它们存储到一个列表中。到目前为止,我能够从 MariaDB 读取数据并将行存储为字典(我更喜欢将输出作为 JSON):

import pymysql
import simplejson as json
import collections
import credentials_global

conn = pymysql.connect(
    host=credentials_global.mariadb_dev_ip_address,
    user=credentials_global.mariadb_dev_username,
    password=credentials_global.mariadb_dev_password,
    port=credentials_global.mariadb_dev_port,
    database=credentials_global.mariadb_dev_db_ticketing,
)

cursor = conn.cursor()
cursor.execute("select a, b, c, d, e, f from master.orders where c = 215")
rows = cursor.fetchall()

objects_list = []
for row in rows:
    d = collections.OrderedDict()
    d["a"] = row[0]
    d["b"] = row[1]
    d["c"] = row[2]
    d["d"] = row[3]
    d["e"] = row[4]
    d["f"] = row[5]
    objects_list.append(d)

j = json.dumps(objects_list)
print(j)

这会产生输出:

[
    {
        "a": 4153,
        "b": "NO_EFFECT",
        "c": "none",
        "d": "Medium",
        "e": 1,
        "f": "No Remarks",
    },
    {
        "a": 4154,
        "b": "SIGNIFICANT",
        "c": "none",
        "d": "Low",
        "e": 1,
        "f": "Test Message",
    },
]

我喜欢提取所有出现的f。我试过了:

for key, value in d.items():
    print(value)

这个输出:

4153
NO_EFFECT
none
Medium
1
No Remarks

4154
SIGNIFICANT
none
Low
1
Test Message

我更喜欢只提取f,以便输出类似于[No Remarks, Test Message](我假设保持顺序)。有人可以帮助我如何实现或在哪里寻找?

谢谢

【问题讨论】:

    标签: python python-3.x ordereddictionary


    【解决方案1】:
    for obj in objects_list:
        print(obj['f'])
    

    OrderedDict 保持键的顺序(a b c ...)。此输出中的顺序来自 objects_list 中的顺序。

    要将其添加到输出列表中:

    only_f_fields = [ obj['f'] for obj in objects_list ]
    

    【讨论】:

      【解决方案2】:

      我认为您正在寻找的答案是

      for key, value in d.items():    
          print(value[0]['f'])
      

      列表中的第一个元素 0,以及该列表中字典中的元素 f。

      【讨论】:

        【解决方案3】:

        假设收到的输出在一个列表中:
        ex = [{"a": 4153, "b": "NO_EFFECT", "c": "none", "d": "Medium", "e": 1, "f": "No Remarks"}, {"a": 4154, "b": "SIGNIFICANT", "c": "none", "d": "Low", "e": 1, "f": "Test Message"}]

        我们可以执行 2 种方式,一种是正常迭代,不假设 key 顺序,另一种是顺序。

        正常迭代检查(仅供说明)

        f_list = list()
        for val in ex:
            for k, v in val.items():
                if k == "f":
                   f_list.append(v)
        
        print(f_list)
        
        输出:

        ['No Remarks', 'Test Message']

        有序字典保持键的顺序:

        f_list = list()
        for val in ex:
            f_list.append(val["f"])
        print(f_list)
        
        输出:

        ['No Remarks', 'Test Message']

        【讨论】:

        • 感谢您的及时回复。我无法在for k, v in val.items(): 中调用items(),我收到错误AttributeError: 'tuple' object has no attribute 'items'
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-28
        • 1970-01-01
        • 2021-09-08
        • 2016-03-12
        • 1970-01-01
        • 2020-11-10
        相关资源
        最近更新 更多