V4kodin
@V4kodin

Как правильно задать json файл?

Здравствуйте, решая contest от яндекса столкнулся с проблемой: Не могу понять в как заданы входные условия задачи.
Условия задачи


По результатам полугодия команда Пандаса Фигандаса не смогла выполнить kpi, который он им поставил. Он задумался, а нет ли в его команде бездельников? Он смог найти файл с последними событиями в репозитории и собирается посчитать научно обоснованный показатель эффективности разработчика - количество написанного кода (в строках), количество добавленных файлов и количество комитов. Но вот же беда - данные ведь в формате json! Помогите ему и предоставьте таблицу в формате .tsv! Таблица должна содержать колонки в следующем порядке

["username", "commits", "changed_lines", "new_files"],

а также должна быть отсортирована по username.

- username - юзернейм разработчика

- commits - количество комитов разработчика

- changed_lines - суммарное количество changed_lines

- new_files - суммарное количество новых файлов добавленных разработчиком. Новым файлом считается любой файл, которого вы раньше не встречали (если смотреть на commit_time). Обратите внимание, что данные изначально не отсортированы по commit_time
Формат ввода

json с данными. ВНИМАНИЕ, ФАЙЛ В КОНТЕСТЕ НАЗЫВАЕТСЯ input.json
Формат вывода

Сохраните получившуюся таблицу в файл output.tsv
Примечания

Pandas при решении задачи использовать запрещено.

Пробывал следующие входные данные:
файл input.json
{
  "username": [
    "Super hero squad",
    "squad",
    "abc"
  ],
  "commits": [
    11,
    22,
    33
  ],
  "changed_lines": [
    22,
    44,
    55
  ],
  "new_files": [
    44,
    88,
    99
  ]
}

Далее разбивал их на словарь функцией json.load из стандартной библиотеки json.

Однако при обращении к любому элементу автотестер яндекса выдает ошибку:
Ошибка
Traceback (most recent call last): File "3d7ce9ba-a219-4533-a14b-eeea772a15bf",

line 32, in main()

File "3d7ce9ba-a219-4533-a14b-eeea772a15bf", line 8, in main

table.append(templates["username"])

TypeError: list indices must be integers or slices, not str

Упрощенный код программы на python
import json


def main():
    table = []
    with open('input.json') as f:
        templates = json.load(f)
    table.append(templates["username"])
    
    
main()

Соответственно входные данные преобразуются в строку а не в словарь, что очень странно для json.
Как можно задать json по факту не являющийся словарем?
Можете привести пример подходящих входных данных?
Либо можно ли обмануть бота яндекса чтобы тот выдал в отчет о тестировании входые данные?
  • Вопрос задан
  • 204 просмотра
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Без примера входных данных смысла решать задачу нет. Пинайте тьютора/поддержку Яндекса, пусть дадут пример файла.
Конечно, можно попробовать хакнуть систему таким образом:
with open('input.json', 'rt') as src:
    raise ValueError(src.read())

Если бот яндекса сообщает текст ошибки, может, удастся таким образом выковырять JSON текст целиком, или хотя бы его часть.
Альтернативно, можно поковырять так:
with open('input.json', 'rt') as src:
    data = json.load(src)
raise ValueError(repr(type(data)))  # вернёт скорее всего <type 'list'>. Закомментируешь эту строку и делаешь:
raise ValueError(repr(data[0]))  # ну и так далее пока не поймешь, что за структуру данных тебе подсовывают.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы