【问题标题】:How to convert dictionary object into string in python 3如何在python 3中将字典对象转换为字符串
【发布时间】:2023-04-01 22:08:01
【问题描述】:

我有嵌套的字典,我需要把这个字典串起来

字典示例

data = {
  'filter': {
      'operator': "and",
      'filters': [{
          'operator': "or",
          'filters': [{
              'operator': "and",
              'filters': [{
                  'value': "blue"
              }, {
                  'value': "green"
              }]
          }, {
              'operator': "and",
              'filters': [{
                  'value': "brown"
              }, {
                  'value': "green"
              }]
          }, {
              'value': "green"
          }]
      }, {
          'value': "red"
      }]
    }
}

我使用递归函数来获取“过滤器”键,但我需要检测括号级别

def recursively(dct, field):

    if field in dct:
        yield dct[field]
    for k in dct:
        if isinstance(dct[k], list):
            for i in dct[k]:
                for j in recursively(i, field):
                    yield j

最后我需要字符串输出

>>> recursivaly(data['filter'], 'filters')
# result
((blue AND green) OR (brown AND green) OR green) AND NOT red

你能帮帮我吗?

【问题讨论】:

  • 标题中的问题具有误导性,有无数种方法可以将字典显示为字符串,您正在寻找转换特定的字典结构以表示逻辑操作
  • 为什么最后是AND NOT red?我在你的结构中没有看到否定运算符。
  • @Nicolás 因为 AND NOT red 意味着搜索任何不包含 red 的字段
  • @PyDroid 但您的字典中没有“NOT”
  • @AntiMatterDynamite 真的你是对的,我使用 new dict { 'value': "red", 'mean': 'not contains', 'field': 'field_name'}, in 'mean ' 示例:包含、不包含、相等、不相等等

标签: string python-3.x dictionary converter


【解决方案1】:

你可以这样做

def dict2str(d):
    if 'value' in d:
        return d['value']
    elif 'operator' in d and 'filters' in d:
        return '(' + (" " + d['operator'].upper() + " ").join(map(dict2str, d['filters'])) + ')'
    else:
        raise Exception('invalid dictionary')

基本上递归地向下字典并返回每个节点的字符串表示。为了简化第二个if,这里有一个更明确的等效代码:

def dict2str(d):
    if 'value' in d:
        return d['value']
    elif 'operator' in d and 'filters' in d:

        operator = " " + d['operator'].upper() + " "

        filters = []
        for filt in d['filters']:
            filters.append(dict2str(filters))

        ret = ""
        ret += "("
        ret += operator.join(filters)
        ret += ")"

        return ret
    else:
        raise Exception('invalid dictionary')

"AND NOT red" 部分让我感到困惑,但我希望这会有所帮助

【讨论】:

    猜你喜欢
    • 2011-03-16
    • 1970-01-01
    • 2016-12-06
    • 2018-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-13
    • 2020-12-29
    相关资源
    最近更新 更多