python - 以任意顺序处理字典键

标签 python dictionary iteration

我想将字典转换为字符串。初学者级别的问题因我必须遵守的一些规则而变得复杂:

  • 有一个已知 key 的列表,必须以特定的任意顺序出现
  • 每个已知键都是可选的,即它可能不存在于字典中
  • 保证字典中至少存在一个已知键
  • 字典可能包含额外的键;它们必须在已知的 key 之后,并且它们的顺序并不重要
  • 我无法对键添加到字典的顺序做出假设

在其他字典键之前处理某些字典键的Python方式是什么?

到目前为止,我有以下功能:

def format_data(input_data):
    data = dict(input_data)
    output = []
    for key in ["title", "slug", "date", "modified", "category", "tags"]:
        if key in data:
            output.append("{}: {}".format(key.title(), data[key]))
            del data[key]

    if data:
        for key in data:
            output.append("{}: {}".format(key.title(), data[key]))

    return "\n".join(output)
data = {
    "tags": "one, two", 
    "slug": "post-title",
    "date": "2017-02-01",
    "title": "Post Title",
}

print(format_data(data))

data = {
    "format": "book",
    "title": "Another Post Title",
    "date": "2017-02-01",
    "slug": "another-post-title",
    "custom": "data",
}

print(format_data(data))

Title: Post Title
Slug: post-title
Date: 2017-02-01
Tags: one, two

Title: Another Post Title
Slug: another-post-title
Date: 2017-02-01
Custom: data
Format: book

虽然这个函数确实提供了预期的结果,但它有一些问题让我认为可能有更好的方法。即,复制output.append()行并复制输入数据结构,以允许对其进行修改而不会产生副作用。

总而言之,如何按特定顺序并在其他键之前处理某些键?

最佳答案

我建议您只需运行一对列表推导式:一个用于所需的键,一个用于其余的。将它们按所需的顺序批量连接,而不是一次连接一个。这将构建输出的关键步骤减少为单个命令。

第一个理解在字典中查找所需的键;第二个查找“所需”列表中的任何字典键。

def format_data(input_data):
    data = dict(input_data)
    key_list = ["title", "slug", "date", "modified", "category", "tags"]
    output = ["{}: {}".format(key.title(), data[key]) for key in key_list if key in data] + \
             ["{}: {}".format(key.title(), data[key]) for key in data if key not in key_list]
    return "\n".join(output)

关于python - 以任意顺序处理字典键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41987331/

相关文章:

Ruby:一次从一个字符串和两个数组值构建哈希

python - 在 Pandas 数据框中将 float 转换为字符串

python - 找到从点到复杂曲线的最小距离

python - Python 的性能问题

python - 迭代迭代器对象中的 "1 or more"元素?

C++:打印 map 值

python - 线程类型错误: 'module' object is not callable

python - 在不使用上下文的情况下发送消息的替代方法是什么?

python - python中带有字典的if else语句

python - 在 Pandas 数据框中存储字典