Как преобразовать вывод простого текста в JSON, используя некоторые правила? - PullRequest
1 голос
/ 11 октября 2019

Я анализирую вывод программы, которая печатает два слова в строке, и эти слова могут быть продублированы. Выходные данные отсортированы.

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}],
]

Как этого добиться? Если возможно, без использования чего-либо, кроме стандартной библиотеки.

Все, что я пробовал, выглядит большим, чудовищным и безобразным.

Нет кода, так как я не смог бы получить никакого результата.

Ответы [ 2 ]

1 голос
/ 11 октября 2019

Вы можете создать диктовку, подобную {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}]}]
0 голосов
/ 11 октября 2019

Сначала упростите вывод, сохранив его в словаре, а затем используйте его для получения ожидаемого вывода, как показано ниже:

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)
...