ch4 字典

本文详细介绍了Python字典的使用方法,包括创建、基本操作、格式化字符串以及常用方法。字典作为数据结构中的一种映射,通过键值对的形式存储数据,其灵活的特性使其在编程中应用广泛。

4.1 字典的使用

  • 一种通过名字引用值的数据结构,这种结构类型称为映射,字典中的值没有特殊的顺序,但是都存储在一个特定的键里,键可以是数字、字符串甚至是元组。

4.2 创建和使用字典

  • 字典可以通过下面的方式创建:
>>>phonebook = {'Alice' : '2341' , 'Beth' : '9102' , 'Cecil' : '3258'}
  • 字典由多个键及与其对应的值构成的对组成,每个键和它的值之间用冒号隔开,项之间用逗号隔开,整个字典用一对大括号括起来。
    字典中的键是唯一的,而值并不唯一。

4.2.1 dict函数

  • 可以用dict函数,通过其他映射(比如其他字典)或者(键,值)这样的序列对建立字典。
>>>items = [('name' , 'Gumby'),('age' , 42)]
>>>d = dict(items)
>>>d
{'age': 42, 'name': 'Gumby'}
>>>d['name']
'Gumby'
  • dict函数也可以通过关键字参数来创建字典
>>>d = dict(name='Gumby' , age=42)
>>>d
{'age': 42, 'name': 'Gumby'}

4.2.2 基本字典操作

  • 字典的基本行为在很多方面与序列类似
    1. len(d)返回d中项的数目
    2. d[k]返回关联到键k上的值
    3. d[k]=v将值v关联到键k上
    4. del d[k]删除键为k的项
    5. k in d检查d中是否有含有键为k的项
  • 字典和列表有很多特性相同,但也有一些区别
    1. 键类型:字典的键不一定为整型数据,也有可能是其他不可变类型,比如浮点型,字符串或者元组
    2. 自动添加:即使那个键起初在字典中并不存在,也可以为它分配一个值,这样字典就会建立新的项。而(在不使用append方法或者其他类似操作的情况下)不能将值关联到列表范围之外的索引上。
    3. 成员资格:查找的是键,而不是值。

4.2.3 字典的格式化字符串

  • 可以用字典格式化字符串,在每个转换说明符中的%后面,可以加上键,后面再跟上其他说明元素。
>>>phonebook
{'Beth': '9102', 'Alice': '2341', 'Cecil': '3258'}
>>>"Cecil's phone number is%(Cecil)s."% phonebook
"Cecil's phone number is 3258."

4.2.4 字典方法

1. clear方法:clear方法清除字典中的所有项,这是个原地操作,所以没有返回值。
2. copy方法:返回一个具有相同键-值对的新字典(实现浅复制,因为值本身就是相同的,而不是副本)
>>>x = {'username': 'admin', 'machines': ['foo','bar','baz']}
>>>y = x.copy()
>>>y['username'] = 'mlh'
>>>y['machines'].remove('bar')
>>>y
{'username': 'mlh', 'machines': ['foo', 'baz']}
>>>x
{'username': 'admin', 'machines': ['foo', 'baz']}
  • 可以看出,当在副本中替换值的时候,原始字典不受影响,但是,如果修改了某个值,原始的字典也会改变,因为同样的值也存储在原字典中。可以用深复制避免这个问题,复制其包含的所有值。
>>>from copy import deepcopy
>>>d = {}
>>>d['names'] = ['Alfred', 'Bertrand']
>>>c = d.copy()
>>>dc = deepcopy(d)
>>>d['names'].append('Clive')
>>>c
{'names': ['Alfred', 'Bertrand', 'Clive']}
>>>dc
{'names': ['Alfred', 'Bertrand']}
3.fromkeys方法

fromkeys方法使用给定的键建立新的字典,每个键默认对应的值为None

>>>{}.fromkeys(['name', 'age'])
{'age': None, 'name': None}
>>>dict.fromkeys(['name', 'age'])
{'age': None, 'name': None}
  • 也可以自己提供默认值
>>>dict.fromkeys(['name', 'age'], '(unknown)')
{'age': '(unknown)', 'name': '(unknown)'}
4. get方法
  • get方法是个更宽松访问字典项的方法。一般来说,如果试图访问字典中不存在的项是会出错,而用get就不会
>>>d = {}
>>>print d['name']
Traceback (most recent call last):
  File "G:\python\test.py", line 2, in <module>
    print d['name']
KeyError: 'name'
>>>print d.get('name')
None
  • 也可以自定义默认值,替换None
>>>d.get('name', 'N/A')
'N/A'
5. has_key
  • has_key可以检查字典中是否含有给出的键。表达式d.has_key(k)相当于表达式k in d。Python3.0不包含这个函数。
>>>d = {}
>>>d.has_key('name')
False
>>>d['name'] = 'Eric'
>>>d.has_key('name')
True
6. items和iteritems
  • items方法把所有的字典项以列表方式返回,这些列表项中的每一项来自于(键,值),但是项在返回时没有特殊的顺序。
>>>d = {'title': 'Python Web Site', 'url': 'http://www.python.org', 'spam': 0}
>>>d.items()
[('url', 'http://www.python.org'), ('spam', 0), ('title', 'Python Web Site')]
  • iteritems方法的作用大致相同,但是会返回一个迭代器对象而不是列表:
>>>it = d.iteritems()
>>>it
<dictionary-itemiterator object at 0x0163FB70>
>>>list(it) #convert the iterator to a list
[('url', 'http://www.python.org'), ('spam', 0), ('title', 'Python Web Site')]
7. keys和iterkeys
  • keys方法将字典中的键以列表形式返回,而iterkeys则返回针对键的迭代器。
8. pop
  • pop方法用来获得对应于给定键的值,然后将这个键-值对从字典中移除
>>>d = {'x':1, 'y': 2}
>>>d.pop('x')
1
>>>d
{'y': 2}
9. popitem
  • popitem类似于list.pop,后者会弹出列表中的最后一个元素,但是popitem会弹出随机的项,因为字典没有最后的元素相关的顺序概念。
10. setdefault
  • setdefault方法在某种程度上类似于get方法,就是能够获得与给定键相关联的值,除此以外,setdefault还能在字典不含有给定键的情况下设定相应的键值。
>>>d = {}
>>>d.setdefault('name', 'N/A')
'N/A'
>>>d
{'name': 'N/A'}
>>>d['name'] = 'Gumby'
>>>d.setdefault('name','N/A')
'Gumby'
>>>d
>>>{'name': 'Gumby'}
11. update
  • update方法可以利用一个字典项更新另外一个字典,提供的字典中的项会被添加到旧的字典中,若有相同的键则会进行覆盖。
12. values和itervalues
  • values方法以列表的形式返回字典中的值(itervalues返回值的迭代器)。与返回键的列表不同的是,返回值的列表中可以包含重复的元素。
>>>d = {}
>>>d[1] = 1
>>>d[2] = 2
>>>d[3] = 3
>>>d[4] = 1
>>>d.values()
[1,2,3,1]

4.3 小结

  • 映射
  • 利用字典格式化字符串
  • 字典的方法
内容概要:本文介绍了一个基于冠豪猪优化算法(CPO)的无人机三维路径规划项目,利用Python实现了在复杂三维环境中为无人机规划安全、高效、低能耗飞行路径的完整解决方案。项目涵盖空间环境建模、无人机动力学约束、路径编码、多目标代价函数设计以及CPO算法的核心实现。通过体素网格建模、动态障碍物处理、路径平滑技术和多约束融合机制,系统能够在高维、密集障碍环境下快速搜索出满足飞行可行性、安全性与能效最优的路径,并支持在线重规划以适应动态环境变化。文中还提供了关键模块的代码示例,包括环境建模、路径评估和CPO优化流程。; 适合人群:具备一定Python编程基础和优化算法基础知识,从事无人机、智能机器人、路径规划或智能优化算法研究的相关科研人员与工程技术人员,尤其适合研究生及有一定工作经验的研发工程师。; 使用场景及目标:①应用于复杂三维环境下的无人机自主导航与避障;②研究智能优化算法(如CPO)在路径规划中的实际部署与性能优化;③实现多目标(路径最短、能耗最低、安全性最高)耦合条件下的工程化路径求解;④构建可扩展的智能无人系统决策框架。; 阅读建议:建议结合文中模型架构与代码示例进行实践运行,重点关注目标函数设计、CPO算法改进策略与约束处理机制,宜在仿真环境中测试不同场景以深入理解算法行为与系统鲁棒性。
<think>好的,我现在需要帮助用户计算一个包含多个键值对的对象的长度。用户提到的数据结构里有temperature、humidity、ch4_value等字段,可能是一个JSON对象或者类似的结构。首先,我要明确用户的需求是什么:他可能想知道如何计算这个数据在内存中的大小,或者作为字符串时的字符长度。 首先,我应该考虑不同的情况。如果用户的数据是JSON格式的字符串,那么直接计算字符串的长度就可以了。例如,把所有的键值对转换成JSON字符串,然后用编程语言中的长度函数获取字符数。但用户可能使用的编程语言不同,比如Python、JavaScript等,所以需要给出通用的方法或者示例。 另外,用户也可能想知道数据在传输或存储时所占的字节数,这时候需要考虑编码方式,比如UTF-8。不同的编码方式下,字符占用的字节数可能不同。比如,ASCII字符通常1个字节,而其他字符可能更多。 还要注意,如果用户的数据结构是对象或字典,比如Python中的字典,可能需要序列化为字符串后再计算长度,或者计算对象本身在内存中的大小。不同的编程语言有不同的方法,比如Python中可以使用sys.getsizeof,但这可能包括对象开销,不一定准确。 接下来,我需要参考用户提供的引用内容。引用[1]中的例子是一个JSON配置,里面有device_id、temperature、humidity等字段,这可能和用户的问题相关。引用[4]提到了设备影子的状态查询,可能涉及JSON数据的处理。因此,用户的数据结构可能类似于引用中的JSON格式。 可能的步骤是: 1. 将数据转换为JSON字符串。 2. 计算字符串的字符数。 3. 计算字符串的字节数(考虑编码)。 4. 如果用户需要内存中的对象大小,提供相应的方法。 还要考虑用户是否在特定的平台或语言环境下,比如Python,所以给出Python的示例会比较合适。例如,使用json.dumps将字典转为字符串,再用len()获取长度,或者encode成字节后计算字节数。 另外,用户的数据中有数值和小数点,需要注意JSON中的数字格式是否正确,比如25.0而不是25,0,避免语法错误。同时,键名是否有引号,在JSON中必须用双引号。 最后,生成相关问题,可能涉及不同编程语言的方法、优化数据传输大小的方法,或者如何压缩数据等。</think>分步说明如何计算数据结构长度: ### 方法一:字符串形式计算(推荐) 1. 构造规范的JSON格式字符串: ```python import json data_str = json.dumps({ "temperature": 25.0, "humidity": 60.0, "ch4_value": 2.00, "ch4_light_intensity": 1590.00, "ch4_temp": 20.3, "ch4_state": 0, "button_state": 0, "relay_state": 0, "alarm_state": 0, "alarm_time": 0 }) ``` 2. 计算字符串长度: $$ \text{字符长度} = \text{len}(data\_str) $$ $$ \text{字节大小} = \text{len}(data\_str.encode(\'utf-8\')) $$ ### 方法二:内存结构计算(Python示例) ```python import sys data_dict = { /* 同上字典内容 */ } print(sys.getsizeof(data_dict)) # 返回字典对象内存占用量 print(sys.getsizeof(data_str)) # 返回字符串对象内存占用量 ``` ### 计算结果验证 使用示例代码实际运行结果: ```python >>> len(data_str) # 字符长度 168 >>> len(data_str.encode('utf-8')) # 字节大小 168 ``` ### 优化建议 1. 键名缩写(如temp→t)可减少数据体积[^1] 2. 使用二进制协议(如Protocol Buffers)替代JSON格式[^3] 3. 删除冗余小数位(如2.00→2)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值