本来想着是挺简单的一件事:(如有交流想法或指正可联系Q775915005)
# -*- coding:utf-8 -*-
import xlrd
filename = r"F:\地理数据\白云区镇街道底图\镇名.xls"
data = xlrd.open_workbook(filename)
table = data.sheets()[0]
ZMC = table.col_values(1, start_rowx=0, end_rowx=None)[1:]
BLC = table.col_values(5, start_rowx=0, end_rowx=None)[1:]
dict0 = dict.fromkeys(BLC,[])
print(dict0, BLC)
n = 0
for i in range(24):
n += 1
print(BLC[i])
dict0[BLC[i]].append(ZMC[i])
print(n, dict0)
print(dict0)
结果是(摘录前两个循环):每个BLC键都将白云湖街放进值列表里
{'8000': [], '10000': [], '5000': [], '7000': [], '6000': [], '11000': []} ['8000', '10000', '5000', '7000', '8000', '5000', '6000', '5000', '8000', '10000', '5000', '6000', '5000', '5000', '6000', '5000', '8000', '5000', '8000', '8000', '6000', '8000', '11000', '11000']
8000
1 {'8000': ['白云湖街'], '10000': ['白云湖街'], '5000': ['白云湖街'], '7000': ['白云湖街'], '6000': ['白云湖街'], '11000': ['白云湖街']}
10000
2 {'8000': ['白云湖街', '大源街'], '10000': ['白云湖街', '大源街'], '5000': ['白云湖街', '大源街'], '7000': ['白云湖街', '大源街'], '6000': ['白云湖街', '大源街'], '11000': ['白云湖街', '大源街']}
网上有说是字典类型的问题,以及“二维字典的两层key和value之间会混淆”
按另一种更通用方式修改;
# -*- coding:utf-8 -*-
import xlrd
filename = r"F:\地理数据\白云区镇街道底图\镇名.xls"
data = xlrd.open_workbook(filename)
table = data.sheets()[0]
ZMC = table.col_values(1, start_rowx=0, end_rowx=None)[1:]
BLC = table.col_values(5, start_rowx=0, end_rowx=None)[1:]
# dict0 = dict.fromkeys(BLC,[])
thedict = {}
# adict = dict0.keys()
for i in range(24):
if BLC[i] in thedict:
thedict[BLC[i]].append(ZMC[i])
else:
thedict.update({BLC[i]:[ZMC[i]]})
print(thedict)
运行成功:(问题可能是 # dict0 = dict.fromkeys(BLC,[]))字典本身在迭代过程中产生的问题)
{'8000': ['白云湖街', '嘉禾街', '均禾街', '永平街', '江高镇', '人和镇', '石门街'], '10000': ['大源街', '龙归街'], '5000': ['鹤龙街', '金沙街', '景泰街', '三元里街', '棠景街', '同德街', '新市街', '云城街'], '7000': ['黄石街'], '6000': ['京溪街', '松洲街', '同和街', '石井街'], '11000': ['太和镇', '钟落潭镇']}
或者另一个种方式使用pandas和defaultdict:
# -*- coding:utf-8 -*-
import pandas as pd
from collections import defaultdict
# 读取Excel文件
df = pd.read_excel(r"F:\地理数据\白云区镇街道底图\镇名.xls")
# 生成defaultdict对象,可以保存多个值
my_dict = defaultdict(list)
print(type(my_dict))
# 遍历Excel表的每一行,将第一列作为键,第二列作为值添加到defaultdict中
for i, row in df.iterrows():
key = row[5]
value = row[1]
my_dict[key].append(value)
# 输出defaultdict对象
print(dict(my_dict))
下面是说明
defaultdict是Python内置的一个字典子类,它的用法和普通字典类似,但是它会为字典中缺少的键设置一个默认值,避免了字典中不存在的键报错的问题。
在使用defaultdict时,需要指定默认值的类型,可以是Python内置类型的任意一种,也可以是自定义类型。当向字典中添加一个不存在的键时,会自动创建该键,并将默认值对应的对象作为该键的值。例如,如果指定默认值为列表,那么每个键的默认值都是一个空列表,如果添加不存在的键时,会自动创建该键,并将空列表作为该键的值。
在生成defaultdict对象时,需要使用collections模块中的defaultdict类:
from collections import defaultdict
my_dict = defaultdict(list)
上面这行代码生成了一个defaultdict对象,键的默认值是一个空列表,这样,在使用my_dict对象时,如果访问其中不存在的键,它会自动创建该键,并将一个空列表作为值。
使用defaultdict时,不需要在添加键值前先判断字典中是否存在该键,可以直接添加,如果字典中不存在该键,就会自动创建新的键。
my_dict = defaultdict(list)
my_dict[1].append('value1')
my_dict[2].append('value2')
my_dict[1].append('value3')
print(my_dict)
# 输出结果: {1: ['value1', 'value3'], 2: ['value2']}
上面的代码中,向my_dict中添加了键值对(1, ‘value1’)和(2, ‘value2’),然后再向键1中添加了另一个值’value3’,这样一个键就对应了多个值。因为我们事先指定了默认值为列表,可以直接向列表中添加元素,而不需要先判断该键是否存在。
使用defaultdict可以避免字典中键不存在的问题,特别是在多次访问同一个不存在的键时可以提高代码的效率。