Как извлечь указанные значения c из OrderedDict? - PullRequest
1 голос
/ 05 апреля 2020

Мне нравится извлекать определенные c ключи и сохранять их в списке. До сих пор я могу читать из 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] (я предполагаю, что последовательность поддерживается). Может кто-нибудь помочь, пожалуйста, как я могу достичь или где искать?

Спасибо

Ответы [ 3 ]

1 голос
/ 05 апреля 2020
for obj in objects_list:
    print(obj['f'])

OrderedDict сохраняет порядок ключей (ab c ...). Порядок в этом выводе исходит из порядка в objects_list.

Чтобы получить его в списке вывода:

only_f_fields = [ obj['f'] for obj in objects_list ]
0 голосов
/ 05 апреля 2020

Предполагая, что полученная продукция находится в списке:
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 способа: один итеративный процесс обычно не предполагает порядка ключей, другой - с порядком.

Обычная итерация и проверка (только для пояснения)

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']

0 голосов
/ 05 апреля 2020

Я думаю, что вы ищете ответ

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

первый элемент 0 в списке, а внутри этого списка элемент f в словаре.

...