我正在尝试构建一个包含许多值的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'时,该值被清除。
答案 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!