通过excel表格制作python字典

本来想着是挺简单的一件事:(如有交流想法或指正可联系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可以避免字典中键不存在的问题,特别是在多次访问同一个不存在的键时可以提高代码的效率。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值