Я создаю многоуровневый вложенный словарь, читая из большого файла CSV.Содержимое файлов имеет следующий формат, в котором хранится соответствующая информация, относящаяся к уникальной книге.Можно предположить, что в каждой строке 6 столбцов (автор, заголовок, год, категория, URL, цитаты);Все записи в столбцах имеют одинаковое форматирование.Например:
Author,Title,Year,Category,Url,Citations
"jk rowling, etc....",goblet of fire,1973,magic: fantasy: english literature,http://doi.acm.org/10.1145/800010.808066,6
"Weiner, Leonard H.",cracking the coding interview,1973,LA: assessment: other,http://doi.acm.org/10.1145/800010.808105,2
"Tolkien",hobbit,1953,magic: fantasy: medieval,http://doi.acm.org/10.1145/800010.808066,6
Я хочу, чтобы выходные данные соответствовали синтаксическому анализу каждой строки в файле CSV, аналогично следующему: * (примечание: количество вложенных словарей зависит от категорий книг взаголовок категории ключей csv. first. на глубине 1, то есть первый подуровень упорядочен по годам, когда книги были выполнены.категории (порядок имеет значение), разделенные разделителем «:». Подумайте о порядке категорий в строке в файле CSV как о каталоге пути: несколько файлов могут иметь один и тот же каталог пути до определенной точки, или они могут иметь одинаковыйпуть к каталогу и помещается в одну и ту же папку.
results = {'1973':{
"magic": {
"fantasy": {
"English literature": {
"name": "goblet of fire",
"citations": 6,
"url": "http://doi.acm.org/10.1145/800010.808066"
}
},},
"medieval": {
"name": "The Hobbit",
"citations": 7,
"url": "http://doi.acm.org/10.1145/800fdfdffd010.808066"
}
},
{'1953': "la": {
"assessment": {
"other": {
"name": "cracking the coding interview",
"citations": 6,
"url": "http://doi.acm.org/10.1145/800010.808105"
}
}
}
}
}
Очевидно, что некоторые книги будут иметь общие общие последовательные категории ИЛИ общие даты публикации вместе, как в примере, который я показал выше. Некоторые книги могут также использовать одни и те жепоследовательные категории. Я думаю, что я должен повторитьсяПоочередно перебирайте строку категорий в строке в csv, либо создавая новые поддикты, которые отличаются от ранее существовавшего порядка категорий, затем создавая словарное представление книги, когда больше нет последовательных категорий для проверки.Я просто не уверен, как именно начать.
Вот что у меня есть, это просто стандартная настройка чтения CSV-файлов:
_, *data = csv.reader(open(DATA_FILE))
new_data = [[i[3].split(': '), *i[4:], *i[:3]] for i in data]
print(json.dumps(group(new_data), indent=4))
return group(new_data)
def group(d):
_d = {}
for a, *b in d:
if a[0] not in _d:
_d[a[0]] = [[a[1:], *b]]
else:
_d[a[0]].append([a[1:], *b])
r = {a: {'books': [
{'name': c[-2],'year':c[-1], 'citations': c[2], 'url': c[1], 'author': c[3]} for
c in b if not c[0]], **(lambda x: {} if not x else group(x))(
[c for c in b if c[0]])} for a, b in _d.items()}
return {a: {c: d for c, d in b.items() if d} for a, b in r.items()}
По сути, я хочучтобы создать древовидное представление этого csv с использованием вложенных словарей, первый уровень упорядочен по дате публикации, следующие уровни далее расширяются в этой и последующих книгах заказов на основе относительного пути категории (т. е. magic: fantasy: etc ...), определяя, какое поддеревопройти / создать.Если две или более книг имеют один и тот же последовательный путь, я хочу сделать так, чтобы все эти книги листали свой соответствующий ключ, вместо того, чтобы переопределять каждую книгу (лист), когда новая книга имеет идентичный путь категории.Листья представляют собой словарное представление книг, упомянутых в каждой строке в CSV.
РЕДАКТИРОВАТЬ: я не могу использовать какие-либо зависимости / внешние модули