【问题标题】:nested dict python keys嵌套字典 python 键
【发布时间】:2014-03-30 11:08:46
【问题描述】:

我想要类似以下结构的东西:y['1'][tuple(list)] = val 作为python中的嵌套字典,但当我尝试时,我得到KeyError

csv 文件中的数据如下:

Rest_id, rates, items
1,4, burger
1,8, tofu_log
2,5, burger
2,8.5, tofu_log
3,4, chef_salad
3,8, steak_salad_sandwich
4,5, steak_salad_sandwich,salad
4,2.5, wine_spritzer
5,4, extreme_fajita3,test2,test4,test
5,8, fancy_european_water
6,5, fancy_european_water
6,6,  extreme_fajita, jalapeno_poppers, extra_salsa
7,1.5, wine_spritzer
7,5, extreme_fajita, jalapeno_poppers

以下是代码:

y = defaultdict(dict)

with open('sample_data_tested_with.csv','r') as f:
            reader = csv.reader(f, delimiter=',', quoting=csv.QUOTE_NONE)
            reader = [[x.strip() for x in row] for row in reader]
            for i in reader:
                #cd[i[0]] = {tuple(i[2:]):i[1]}
                #cd[i[0]][tuple(i[2:])].update(i[1])
                print i[0], i[1], tuple(i[2:])
                y[i[0]][tuple(i[2:])].append(i[1])

稍后我想在字典中搜索y['rest_id']['item'] 并找到相应的费率。 提前致谢。

来自 ipython 的完整堆栈:

 In [49]: with open('sample_data_tested_with.csv','r') as f:
            reader = csv.reader(f, delimiter=',', quoting=csv.QUOTE_NONE)
            reader = [[x.strip() for x in row] for row in reader]
            for i in reader:
                #cd[i[0]] = {tuple(i[2:]):i[1]}
                #cd[i[0]][tuple(i[2:])].update(i[1])
                print i[0], i[1], tuple(i[2:])
                #x[tuple(i[2:])]=float(i[1])
                y[i[0]][tuple(i[2:])].append(i[1])
   ....:         
 1 4 ('burger',)
 ---------------------------------------------------------------------------
 KeyError                                  Traceback (most recent call last)
 <ipython-input-49-ab608c2dc33a> in <module>()
       7                     print i[0], i[1], tuple(i[2:])
       8                     #x[tuple(i[2:])]=float(i[1])
 ----> 9                     y[i[0]][tuple(i[2:])].append(i[1])
       10 

  KeyError: ('burger',)

【问题讨论】:

  • 我可以拥有 y = defaultdict(list) 并附加数据,但我无法根据以下键搜索数据:y['rest_id']['item']

标签: python dictionary nested key


【解决方案1】:

看起来你可以使用itertools.groupby

>>>import itertools
>>>newreader,keys=[],[]
>>>for k,g in itertools.groupby(reader,key=lambda x:x[0]):
      newreader.append(tuple(g[1:]))
      keys.append(k)

这应该将您的数据分组为元组。 现在我们遍历 newreader 将每个元组转换为一个字典。

>>>d={}
>>>for *i,j in newreader,keys:
     d[j]=dict(i)

【讨论】:

  • 我现在收到以下错误:ValueError Traceback (最近一次调用最后一次) in () ----> 1 for i,j in newreader ,keys: 2 d[j] = dict(i) 3 ValueError: too many values to unpack
  • @snehalparmar 感谢您的反馈,让我检查一下。
  • @snehalparmar 您能否在您的打印语句提供的原始问题的输出中进行编辑?
  • @snehalparmar 更新的代码有效吗?我正在使用 Cpython,所以我不知道这是否是特定于实现的。
  • @snehalparmar 现在检查。如果没有,那我什么都没有。
【解决方案2】:

这是我得到的解决方案,如果有人发现它有任何问题,请检查并告知,非常感谢。

def create_NestedDict(filename):
    NestedDict = defaultdict(dict)
    with open(filename,'rb') as f:
        reader = csv.reader(f, delimiter=',')
        for row in reader:
            #print "row :", row
            record = row
            if record[0] not in NestedDict:
                NestedDict[record[0]] = {}
            items = tuple([ i.strip() for i in record[2:]])
            [record[0]][items] = record[1]
    return NestedDict

【讨论】:

    猜你喜欢
    • 2021-05-10
    • 1970-01-01
    • 2020-10-01
    • 2019-11-18
    • 2022-01-13
    • 2011-12-02
    • 2022-01-15
    • 2018-02-09
    • 2016-11-24
    相关资源
    最近更新 更多