---编辑2--- 所以我得到了一个问题:为什么我使用字典? 这个问题是这个问题的后续问题:csv file compression without using existing libraries in Python
我需要压缩一个 500k csv 文件 (19MB),我选择使用字典将刻度存储在一个 csv 文件中,将符号存储在另一个 csv 文件中,以便能够解压缩值
问题:如何迭代最优化的方式?这只是 4 行的示例,但我的真实文件有 500 000 行,并且需要我永远遍历列表。
我有 3 本词典:
originalDict = {
0: ['6NH8', 'F', 'A', '0', '60541567', '60541567', '78.78', '20'],
1: ['6NH8', 'F', 'A', '0', '60541569', '60541569', '78.78', '25'],
2: ['6AH8', 'F', 'B', '0', '60541765', '60541765', '90.52', '1'],
3: ['QMH8', 'F', 'B', '0', '60437395', '60437395', '950.5', '1']
}
ticks = {0: '6NH8', 1: '6AH8', 2: 'QMH8'}
symbs = {0: 'F,A', 1: 'F,B'}
我想迭代originalDict并更改“ticks”,然后更改index 1
和index 2
处的符号,然后删除index 2
所以,即
0: ['6NH8', 'F', 'A', '0', '60541567', '60541567', '78.78', '20']
变成:
[0, '0', '0', '60541567', '60541567', '78.78', '20']
我当前有一个 for 循环,它遍历 OriginalDict 中的值,并且在另一个 for 循环内:
for values in originalDict.values():
for ticksKey, ticksValue in ticks.items():
if values[0] == ticksValue:
values[0] = ticksKey
#Change symbs and remove char combination
for symbsKey, symbsValue in symbs.items():
comprComb = values[1] + "," + values[2]
if comprComb == symbsValue:
values[1] = str(symbsKey)
#del values[4]
#del values[4]
del values[2]
添加的其他信息: 我将它们作为字典的原因是因为在 500 000 行中,某些刻度出现多次,因此,我给它们一个 int,它是字典中的键,所以 symbs 字典也适用。
最佳答案
因此,首先您要反转映射,您当前正在按值查找,这是错误且缓慢的:
ticks = {0: '6NH8', 1: '6AH8', 2: 'QMH8'}
symbs = {0: 'F,A', 1: 'F,B'}
使用ticks = {v: k for k, v in ticks.items()}
(symbs
相同):
{'6NH8': 0, 'QMH8': 2, '6AH8': 1} # ticks
{'F,A': 0, 'F,B': 1} # symbs
现在您已经有了良好的数据结构,您可以相当快地完成此操作。
现在将保存数据的字典转换为列表(不知道为什么它是一个字典):
originalList = [originalDict[k] for k in range(len(originalDict))]
并重新映射值:
for line in originalList:
line[0] = ticks[line[0]]
line[1:3] = [symbs["%s,%s" % tuple(line[1:3])]]
结果:
[[0, 0, '0', '60541567', '60541567', '78.78', '20'], [0, 0, '0', '60541569', '60541569', '78.78', '25'], [1, 1, '0', '60541765', '60541765', '90.52', '1'], [2, 1, '0', '60437395', '60437395', '950.5', '1']]
关于python - 在Python中同时迭代2个不同的字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38678686/