我有以下代码:
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
我很清楚,它为两个键添加了相同的值,但我不明白为什么。 如果有人可以在有或没有工作代码条的情况下澄清它会有很大帮助。
答案 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]