【问题标题】:How to transform some plain text output into JSON using some rules?如何使用一些规则将一些纯文本输出转换为 JSON?
【发布时间】:2019-10-11 09:24:45
【问题描述】:

我正在解析一个程序的输出,该程序在一行中打印两个单词,并且这些单词可以重复。输出已排序。

a  1
a  2
b  5
c  6
c  6
d  3
e  1
e  1
e  2
f  0

我想创建一个看起来像这样的字典(使用我提供的输入数据):

[
  {"name": "a", numbers: [{"number": "1", "duplicated": false},
                          {"number": "2", "duplicated": false}]},
  {"name": "b", numbers: [{"number": "5", "duplicated": false}],
  {"name": "c", numbers: [{"number": "6", "duplicated": true}],
  {"name": "d", numbers: [{"number": "3", "duplicated": false}],
  {"name": "e", numbers: [{"number": "1", "duplicated": true},
                          {"number": "2", "duplicated": false}]},
  {"name": "f", numbers: [{"number": "0", "duplicated": false}],
]

我怎样才能做到这一点?如果可能,除了标准库之外不使用任何东西。

我尝试过的所有东西都看起来又大又怪又丑。

没有代码,因为我无法得到任何结果。

【问题讨论】:

  • 请告诉您如何解析输出?从文件或其他来源解析?
  • 这有关系吗?我正在使用 subprocess.PIPE。
  • 你不想要像{'a':{1:0, 2:0}, 'b':{5:0}, 'c':{6:1}, 'd':{3:0}, 'e':{1:1, 2:0}, 'f':{0:0}} 这样的字典有什么原因 - “简单胜于复杂。”“扁平胜于嵌套” 。”
  • 该结构进入前端。我也没有提供完整的结构。

标签: python python-2.7 data-processing


【解决方案1】:

你可以构建一个像{name_a: {value1: count1, value2:count2} ...} 这样的字典,然后从中生成你的输出:

from collections import defaultdict

name_to_values = defaultdict(lambda: defaultdict(int))
with open('data.txt') as f:
    for line in f:
        name, value = line.split()
        name_to_values[name][value] += 1

out = []
for name in name_to_values:
    d = {'name': name}
    d['numbers'] = [{'number': value, 'duplicated': count > 1 }
                    for value, count in name_to_values[name].items()]
    out.append(d)

输出:

print(out)

# [{'name': 'a', 'numbers': [{'number': '1', 'duplicated': False}, {'number': '2', 'duplicated': False}]},
#  {'name': 'b', 'numbers': [{'number': '5', 'duplicated': False}]}, 
#  {'name': 'c', 'numbers': [{'number': '6', 'duplicated': True}]},
#  {'name': 'd', 'numbers': [{'number': '3', 'duplicated': False}]},
#  {'name': 'e', 'numbers': [{'number': '1', 'duplicated': True}, 
#  {'number': '2', 'duplicated': False}]}, 
#  {'name': 'f', 'numbers': [{'number': '0', 'duplicated': False}]}]

【讨论】:

    【解决方案2】:

    首先,通过将输出存储在字典中来简化输出,然后使用它来生成预期的输出,如下所示:

    from pprint import pprint
    
    lines ="""a  1
    a  2
    b  5
    c  6
    c  6
    d  3
    e  1
    e  1
    e  2
    f  0"""
    
    d = dict()
    for line in lines.split("\n"):
        name, number = line.strip().split()
        if d.get(name):
            d[name].append(number)
        else:
            d[name] = [number]
    
    results = []
    for name, numbers in d.items():
        number_list = []
        for num in set(numbers):
            number_list.append({
                'number': num,
                'duplicated': str(numbers.count(num)>1),
            })
        results.append({
            'name': name,
            'numbers': number_list,
            })
    pprint(results)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-04
      • 2021-06-30
      • 1970-01-01
      • 1970-01-01
      • 2022-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多