在循环中构建dict会将值添加到错误的键

时间:2015-10-29 08:36:56

标签: python for-loop dictionary

我有以下代码:

data = open(filename).readlines()
result = {}
for d in data:
    res[d[0:11]] = d

数据中的每一行看起来都是这样,并且有251个带有2个不同的"键"在前11个字符中:

205583620002008TAVG  420  M  400  M 1140  M 1590  M 2160  M 2400  M 3030  M 2840  M 2570  M 2070  M 1320  M  750  M
205583620002009TAVG  380  M  890  M 1060  M 1630  M 2190  M 2620  M 2880  M 2790  M 2500  M 2130  M 1210  M  640  M
205583620002010TAVG  530  M  750  M  930  M 1280  M 2080  M 2380  M 2890  M 3070  M 2620  M 1920  M 1400  M  790  M
205583620002011TAVG  150  M  600  M  930  M 1600  M 2160  M 2430  M 3000  M 2790  M 2430  M 1910  M 1670  M  650  M
205583620002012TAVG  470  M  440  M  950  M 1750  M 2130  M 2430  M 2970  M 2900  M 2370  M 1980  M 1220  M  630  M
205583620002013TAVG  460  M  680  M 1100  M 1530  M 2130  M 2410  M 3200  M 3100  M-9999   -9999   -9999   -9999 XM
205583620002014TAVG-9999 XC-9999 XC-9999 XC-9999 XC-9999 XP-9999 XC-9999 XC-9999 XC-9999 XC-9999 XC-9999 XC-9999 XC
205583620002015TAVG-9999 XC-9999 XC-9999 XC-9999 XC-9999 XC-9999 XC-9999 XC-9999 XK-9999 XP-9999   -9999   -9999   
210476000001930TAVG  153  0  343  0  593  0 1033  0 1463  0 1893  0 2493  0 2583  0 2023  0 1483  0  873  0  473  0
210476000001931TAVG  203  0   73  0  473  0  833  0 1383  0 1823  0 2043  0 2513  0 2003  0 1413  0 1033  0  543  0
210476000001932TAVG  433  0  243  0  403  0  933  0 1503  0 1833  0 2353  0 2493  0 2043  0 1393  0  963  0  583  0
210476000001933TAVG  133  0   53  0  213  0  953  0 1553  0 1983  0 2543  0 2543  0 2043  0 1403  0  973  0  503  0
210476000001934TAVG  103  0  153  0  333  0  843  0 1493  0 1933  0 2243  0 2353  0 1983  0 1353  0  863  0  523  0
210476000001935TAVG  243  0  273  0  503  0  983  0 1453  0 1893  0 2303  0 2343  0 2053  0 1473  0  993  0  453  0
210476000001936TAVG   -7  0   33  0  223  0  903  0 1433  0 1983  0 2293  0 2383  0 2153  0 1443  0  913  0  573  0

键输出为:

print res.keys()
>['20558362000', '21047600000']

为了检查结果我有3张照片:

print len(res.values())
print len(res.values()[0])
print len(res.values()[1])

我的预期输出是:

2
165
86

但我最终得到了:

2
116
116

我很清楚,它为两个键添加了相同的值,但我不明白为什么。 如果有人可以在有或没有工作代码条的情况下澄清它会有很大帮助。

3 个答案:

答案 0 :(得分:0)

使用时

res[d[0:11]] = d

dict中的条目被覆盖,每行的长度为116个字符。所以

print len(res.values()[0])

返回单行的长度,而不是多个元素。

你需要这样的事情:

for d in data:
    key = d[0:11]
    if key in res:
        res[key].append(d)
    else:
        res[key] = [d]

结帐defaultkey

答案 1 :(得分:0)

答案很简单:您用作键的字符串的前10个字符在您的示例中都是相同的,因此键的值不断重置!

使用此代码作为证明(替换为filename的名称):

filename = 'test.dat'
data = open(filename).readlines()
result = {}
for d in data:
    key = d[0:11]
    if key in result:
        print  'key {key} already in {dict}'.format(key=key, dict=result)
    result[key] = d

print result

答案 2 :(得分:0)

如果要收集多行,则应将它们按顺序存储(最好是列表)。现在你用新的一行覆盖以前存储的行(这是res[d[0:11]] = d的作用)。

可能的解决方案:

data = open(filename).readlines()
result = {}
for d in data:
    try:
        res[d[0:11]].append(d)
    except KeyError:
        res[d[0:11]] = [d]