在dict中附加列表的最佳方法是什么?

时间:2014-03-15 08:09:14

标签: python list dictionary

我正在尝试构建一个包含许多值的1个键的列表。我能想到的最好方法是将键值指向列表。但是,我在编写dict中的列表时遇到了问题。

num_items = len(decoded_data['data']['arrivalsAndDepartures'])
buses = list()
busdict = dict()
val = list() 
for i in range(num_items):
  decoded_data['data']['arrivalsAndDepartures']
  bus = decoded_data['data']['arrivalsAndDepartures'][i]['routeId']
   buses.append(bus)
   try:
     busdict[bus]
   except KeyError:
    busdict[bus] = [i]
    print("except "+  bus , str(i))
   else:
    val = busdict[bus]
    busdict[bus] = [val].append(i)
    print("else "+ bus ,val, str(i))

这给我带来了奇怪的结果。

  

$ python test.py

  除了40_590 0
  除了40_554 1
  除了40_592 2
  别的40_590 [0] 3
  除了1_122 4
  除了40_577 5
  否则40_590无6

从上面的测试结果中,第三次击中键'40_590'时,该值被清除。

2 个答案:

答案 0 :(得分:1)

busdict[bus] = [val].append(i)

list.append是一个就地操作并返回None。因此,您要清除之前存储的列表。你可以像这样修复它

busdict[bus].append(i)

但解决此问题的最佳方法是使用dict.setdefault函数(如果未找到指定的键,则分配并返回默认值),如下所示

busdict.setdefault(bus, []).append(i)

但解决此问题的最佳方法是使用collections.defaultdict,就像这样

from collections import defaultdict
busdict = defaultdict(list)
...
...
busdict[bus].append(i)

答案 1 :(得分:0)

list.append()不会返回值。像这样使用它:

   else:
    val = busdict[bus].append(i)
    print("else "+ bus ,val, str(i))

顺便说一下:use four spaces for indents