【问题标题】:Python: inserting into a list within a dictionary based on matchingPython:根据匹配插入字典中的列表
【发布时间】:2014-02-12 02:02:39
【问题描述】:

我目前正在尝试将值插入到列表中,该列表通过首先识别匹配项被打包到字典中。如果我有这样的字典:

{'12633': ['11-Mar-11', '26-Apr-11'], '11359': [], '11458': ['6-Aug-10'], '16335': ['29-May-13'], '11101': []}

我目前正在尝试做的是逐行读取文件并确定密钥是否存在于我的字典中。然后确定该值是否匹配或存在于字典键返回的列表中。此时,我想从列表中匹配值旁边的行中插入一个值。

with open('Pfa.csv', 'r') as f:
    for line in f:
        #split the line up into individual element - it's a csv file
        line = line.strip('/n')
        splitline = line.split(',')
        #check if the value in the file exists as a key in the dictionary
        if splitline[0] in Ndates:
            #iterate over the list in the dictionary
            for item in Ndates[splitline[0]]:
                #check if the item within the dictionary list is within this line in the file
                if item == splitline[1]:
                    #insert a vale from the file next to the value in the list within the dictionary
                    Ndates[splitline[0]].insert(Ndates[splitline[0]].index(item), splitline[4].strip('\n'))

不幸的是,由于某种我无法识别的原因,它似乎卡在循环数据上。只需将值附加到列表中就可以了,但是它很乱并且有将近 3k 个值,我不想手动完成。

非常感谢任何帮助让我知道我哪里出错了。我觉得我这样做效率很低,但我愿意学习。

【问题讨论】:

    标签: python loops dictionary insert indexing


    【解决方案1】:

    您在迭代列表时正在修改列表。

    一个修复:

            #iterate over the list in the dictionary
            for item in Ndates[splitline[0]][:]:
    

    这会在迭代之前复制列表。

    但我建议重构:

    import csv
    
    with open('Pfa.csv') as f: #'r' is default
        for row in csv.reader(f):
            key = row[0]
            try:
                values = Ndates[key]
                i = values.index(row[1])
            except (KeyError, ValueError):
                pass
            else:
                values.insert(i, row[4]) #this will insert *before* the match; use i + 1 insert *after*
    

    【讨论】:

    • 非常感谢。您的解决方案效果很好,我真的很喜欢它显着地分解它。我有一种感觉,在迭代列表时修改列表是问题所在,但不确定在哪里修复它。再次感谢您。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-06
    • 2021-07-10
    • 2022-10-18
    • 2015-07-03
    • 2013-02-28
    • 1970-01-01
    相关资源
    最近更新 更多