【问题标题】:Python dictionary update based on csv file基于csv文件的Python字典更新
【发布时间】:2018-11-16 02:23:10
【问题描述】:

我有一个 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]} 或创建一个新的。 有什么想法吗?

【问题讨论】:

    标签: python python-3.x csv dictionary parent


    【解决方案1】:

    这是使用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']}
    

    【讨论】:

    • 你的意思是复制整个csv文件并存储在mystr中吗?
    • 不,我的意思是用with open('file.csv', 'r') as fin替换with mystr as fin
    【解决方案2】:

    你可以这样做

    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()}
    

    【讨论】:

    • 要获取行,您应该像在jpp 回答中那样做。我根据它修改了我的答案以使其完整。
    猜你喜欢
    • 2016-02-20
    • 2021-06-02
    • 2021-07-08
    • 1970-01-01
    • 1970-01-01
    • 2019-10-20
    • 1970-01-01
    • 2017-08-09
    • 1970-01-01
    相关资源
    最近更新 更多