Обновление словаря Python на основе файла CSV - PullRequest
0 голосов
/ 06 июня 2018

У меня есть CSV-файл, где:

id, word, super_id
100 , cat, 5
5 , bird, Nan
3 , dog, 100
20, fox , 100

Я создал следующий словарь: d= {100: [5, 3, 20], 3: [100]}

  • , где узел 100 имеет родительский 5 и дочерние 3, 20
  • узел 3 имеет родителя 100 и не имеет дочерних элементов

Мне нужно обновить словарь так, чтобы он стал: d= {cat: [bird, dog, fox], dog: [cat]} или создать новый.Есть идеи?

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Это один из способов использования модуля csv и пары словарных понятий:

import csv
from io import StringIO

mystr = StringIO("""id, word, super_id
1 , cat, 2
2 , bird, Nan
3 , dog, 1
4, fox , 1""")

# replace mystr with open('file.csv', 'r')
with mystr as fin:
    reader = csv.reader(fin, skipinitialspace=True)
    next(reader)  # ignore header row, or use headers = next(reader) to extract
    fin_d = {int(ide): word for ide, word, super_id in reader}

d = {1: [2, 3, 4], 3: [1]}

# map keys and values of d using fin_d
res = {fin_d[k]: list(map(fin_d.get, v)) for k, v in d.items()}

print(res)

{'cat': ['bird', 'dog', 'fox '], 'dog': ['cat']}
0 голосов
/ 06 июня 2018

Вы можете сделать это так

import csv


d = {100: [5, 3, 20], 3: [100]}

with open('file.csv', 'r') as csv_file:
    rows = csv.reader(csv_file, skipinitialspace=True)
    next(rows) 
    names = {int(row[0]): row[1] for row in rows}

result = {names[key]: [names[item_id] for item_id in value] for key, value in d.items()}
...