#javascript #python #json #performance #type-conversion
#javascript #python #json #Производительность #преобразование типов
Вопрос:
Мой вариант использования выглядит следующим образом,
Формат ввода — строка с фиксированной общей длиной, и каждый набор фиксированных позиций представляет некоторое значение.
Например. Пусть входные данные будут "ABCDE12345"
и учитывают, что позиции с 1 по 3 ("ABC")
будут представлять значение поля 1, позиции с 4 по 7 ("DE12")
будут представлять значение поля 2, позиции с 8 по 10 ("345")
будут представлять значение поля 3
Формат вывода — объектно-ориентированная структура, такая как JSON
{
"field1" : "ABC",
"field2" : "DE12",
"field3" : "345"
}
Мои требования в порядке приоритета
- Преобразование из входного формата в выходной формат, например JSON
- Скорость преобразования должна быть как можно более быстрой. Язык программирования может быть выбран соответствующим образом. Предпочтительно js или python. В качестве решения также приветствуются другие языки.
- (Необязательно) Как мы можем масштабировать это решение для 1000 конверсий как можно быстрее?
Комментарии:
1. И что вы пробовали до сих пор, например, разделить эту строку на три части и т.д.? Я бы с удовольствием написал код для вашего домашнего задания, но, к сожалению, вам придется нанять меня :/
2. Я попробовал решение с помощью Java script. Шаг 1 — разделение с помощью регулярных выражений в массив, шаг 2 — подача элементов массива в структуру json. Я хотел искать разные варианты у других программистов, а не исправлять свое решение. Приветствуется любое решение, которое удовлетворит моему варианту использования.
Ответ №1:
- Попробуйте это:
string_to_dict = lambda input_str: {«field1»:input_str[:3], «field2»:input_str[3:7], «field3»:input_str[7:]} string_to_dict(«ABCDE12345»)
{‘field1’: ‘ABC’, ‘field2’: ‘DE12’, ‘field3’: ‘345’}
- скорость зависит от вашего источника ввода. в случае, если у вас есть фрейм данных pandas, вы можете увеличить скорость, применив эту функцию к ряду с помощью функции «map»:
df[‘stinrg_series’].map(string_to_dict)
Ответ №2:
Если вы подготовите структуру данных, представляющую поля с именами и длинами в последовательном порядке, вы можете применить ее в понимании словаря для разделения данных на отдельные ключи и значения. Затем используйте модуль json для преобразования словаря
from itertools import accumulate
import json
structure = [("field1",3),("field2",2),("field3",5)] # define names and lengths
positions = [0,*accumulate(size for _,size in structure)] # computed starting positions
data = "ABCDE12345"
dictdata = { name:data[pos:pos size] for (name,size),pos in zip(structure,positions) }
jsondata = json.dumps(dictdata)
print(jsondata)
# {"field1": "ABC", "field2": "DE", "field3": "12345"}
Ответ №3:
Вы могли бы сделать что-то вроде этого:
function strToObj(str, interface) {
const outObj = {};
let index = 0;
Object.entries(interface).forEach(([key, value]) => {
outObj[key] = str.slice(index, index value);
index = value
});
return JSON.stringify(outObj);
}
const testStr1 = 'ABCDE12345';
const testInterface1 = {
key1: 3, // 'key1' will become the object key and 3 indicates the number of characters to use for the value
key2: 4,
key3: 3
}
const testStr2 = ' 15417543010';
const testInterface2 = {
intlPrefix: 2,
localPrefix: 3,
phonenumber: 7
}
console.log(strToObj(testStr1, testInterface1));
console.log(strToObj(testStr2, testInterface2));
Или упрощенная версия, если вам не нужно создавать повторно используемую функцию