Python (七)字典补充

本文介绍了一个使用Python字典来合并两个不同类型的通讯录(电话号码和电子邮件地址)的示例。通过读取两个文本文件并将内容存入字典中,最终将合并后的通讯录输出到一个新的文本文件中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

字典练习代码以及运行结果,如图:

利用字典将两个通讯录文本合并为一个文本,‘gbk'是用来将中文写入文本,防止乱码情况发生。

文本文件数据如图:


代码如下:

# dictionary2.py
# encoding=utf-8
# 使用字典结构合并新地址
def main():
    ftele2=open('TeleAddressBook.txt','rb')
    ftele1=open('EmailAddressBook.txt','rb')

    ftele2.readline()#跳过第一行
    ftele1.readline()
    lines1=ftele1.readlines()
    lines2=ftele2.readlines()

    dic1 = {}   # 字典方式保存
    dic2 = {}

    for line in lines1:#获取第一个文本中的姓名和电话信息
        elements = line.split()
        #将文本读出来的bytes转换为str类型
        dic1[elements[0]] = str(elements[1].decode('gbk'))

    for line in lines2:#获取第二个文本中的姓名和邮箱信息
        elements = line.split()
        dic2[elements[0]] = str(elements[1].decode('gbk'))

    ###开始处理###
    lines = []
    lines.append('姓名\t	电话\t	邮箱\n')

    for key in dic1:
        s=''
        if key in dic2.keys():
            s = '\t'.join([str(key.decode('gbk')),dic1[key],dic2[key]])
            s += '\n'
        else:
            s = '\t'.join([str(key.decode('gbk')),dic1[key],str('   ----    ')])
            s += '\n'
        lines.append(s)
        
    for key in dic2:
        s = ''
        if key not in dic1.keys():
            s = '\t'.join([str(key.decode('gbk')),str('   ----    '),dic2[key]])
            s += '\n'
        lines.append(s)

    ftele3 = open('AddressBook.txt','w')
    ftele3.writelines(lines)

    ftele3.close()
    ftele2.close()
    ftele1.close()
    
if __name__ == '__main__':
    main()
            
            
        

运行结果:






<think>好的,我现在要回答用户关于Python字典类型的使用方法和特性的问题。首先,我需要整理用户提供的引用内容,确保准确引用相关信息,并且按照用户的要求组织回答结构。 首先,根据引用[4],字典是mutable(可变的),这意味着可以修改其内容。同时,键必须是可哈希的类型,比如数字或字符串,而值可以是任何数据类型。另外,键是唯一的,重复的键会覆盖之前的。这些是字典的基本特性,需要首先提到。 接下来,关于字典的创建和初始化,引用[2]提到可以使用推导式来构建字典,这使得代码更简洁。例如,字典推导式可以替代传统的dict构造函数,这应该在示例代码中展示。同时,用户可能想知道如何创建空字典或者带有初始键值对的字典,这部分需要补充。 然后是常用操作,如增删改查。根据引用[1],内置函数如len()和str()适用于字典,但用户可能需要具体的例子,比如如何添加键值对、删除条目(使用pop()或del)、更新值等。这部分需要详细说明,并给出代码示例。 优雅操作方面,引用[3]提到可以自定义字典类型,允许通过点操作符访问键。虽然标准字典支持,但可以通过继承dict类并实现__getattr__和__setattr__方法来实现。这部分可以作为进阶用法介绍,并提供一个简单的自定义字典示例。 特性总结部分需要整合所有关键点,如可变性、键的唯一性、高效的查找等。这里可以引用引用[4]中的内容,强调字典的高效查找特性,以及键的要求。 最后,生成相关问题需要考虑用户可能想深入了解的方向,比如性能优化、应用场景、与其他数据结构的比较等。确保问题覆盖字典同方面,帮助用户进一步学习。 需要检查是否所有LaTeX格式正确,行内公式用$...$,独立公式用$$...$$,但问题中没有数学表达式,所以可能需要。但需要确保代码块正确使用Python语法高亮,并正确分段。同时,所有引用标识要自然地放在句末,如[^1]。 现在组织回答的结构: 1. 字典的基本特性:可变性、键值要求、唯一键、高效查找。 2. 创建和初始化:空字典、字面量、推导式(引用[2])。 3. 常用操作:增删改查,使用内置函数和方法(引用[1])。 4. 优雅操作:自定义字典的点访问(引用[3])。 5. 特性总结。 6. 相关问题。 在写作过程中,要确保每个部分都正确引用对应的来源,并且语言简洁清晰。同时,检查代码示例的正确性,比如推导式的例子是否正确,自定义字典的实现是否合理。还要注意用户要求使用中文回答,避免术语错误。 可能需要注意的细节:键必须是可哈希的,比如可变类型,如字符串、数字、元组(如果元组内的元素都是可变的)。而值可以是任意类型,包括列表、字典等。这一点需要明确说明。 另外,在自定义字典部分,需要说明通过覆盖__getattr__和__setattr__方法来实现属性式访问,这样用户即使遇到AttributeError,也能理解如何解决。 最后,确保相关问题是开放性的,能够引导用户进一步探索,例如性能优化方法、实际应用案例等。</think>### Python字典类型的使用方法与特性 #### 1. **基本特性** Python字典是一种**可变的(mutable)**数据结构,以键值对(key-value)形式存储数据[^4]。其核心特性包括: - **键唯一性**:每个键(key)唯一,若重复则后值覆盖前值。 - **键类型限制**:键必须是**可哈希(hashable)**类型(如字符串、数字、元组),而值可为任意类型。 - **高效查找**:基于哈希表实现,键查找时间复杂度接近$O(1)$[^4]。 #### 2. **创建与初始化** 字典可通过多种方式创建: - **字面量声明**: ```python d1 = {} # 空字典 d2 = {'name': 'Alice', 'age': 30} ``` - **构造函数**: ```python d3 = dict(name='Bob', age=25) ``` - **字典推导式**(更简洁): ```python keys = ['a', 'b', 'c'] d4 = {k: v for k, v in zip(keys, [1, 2, 3])} # {'a':1, 'b':2, 'c':3} [^2] ``` #### 3. **常用操作** - **增删改查**: ```python d = {} d['key'] = 'value' # 添加/修改键值对 value = d.get('key', None) # 安全获取值,避免KeyError del d['key'] # 删除键 d.pop('key', None) # 删除并返回值 ``` - **内置函数**: ```python len(d) # 返回键值对数量[^1] str(d) # 转为字符串表示(如"{'key': 'value'}") ``` #### 4. **优雅操作:自定义字典** 通过继承`dict`类并重写方法,可实现**属性式访问**: ```python class AttrDict(dict): def __getattr__(self, key): return self[key] def __setattr__(self, key, value): self[key] = value d = AttrDict() d.name = 'Alice' # 等价于d['name'] = 'Alice' [^3] ``` #### 5. **特性总结** | 特性 | 说明 | |---------------------|----------------------------------------------------------------------| | 可变性 | 支持动态增删改键值对 | | 键唯一性 | 重复键覆盖旧值 | | 高效查找 | 基于哈希表,时间复杂度$O(1)$ | | 键类型限制 | 键需为可哈希类型(如可变类型) |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值