下面是“Python 列表和字典常踩坑即解决方案”的完整攻略。
Python 列表常踩坑及解决方案
1、修改列表中的元素时出现意外
我们可以通过索引来修改列表中的元素,但是有时候我们修改的并不是当前的元素。例如:
colors = ['red', 'green', 'blue']
for color in colors:
if color == 'red':
color = 'yellow'
print(colors) # 结果仍然为['red', 'green', 'blue']
我们希望将列表中的 'red' 修改为 'yellow',但是在上面的代码中,实际上只是将变量 color 的值修改为了 'yellow',而不是列表中的元素。这是因为在 for 循环中,color 并不是指向列表中的元素,而是指向了当前元素的一个副本。
解决这个问题的方法很简单,我们可以使用索引来直接修改元素:
colors = ['red', 'green', 'blue']
for i in range(len(colors)):
if colors[i] == 'red':
colors[i] = 'yellow'
print(colors) # ['yellow', 'green', 'blue']
或者使用 enumerate() 函数:
colors = ['red', 'green', 'blue']
for i, color in enumerate(colors):
if color == 'red':
colors[i] = 'yellow'
print(colors) # ['yellow', 'green', 'blue']
2、在循环中删除列表元素时出现意外
在循环中删除列表元素时需要注意,删除元素后列表的大小也会随之改变,容易导致出现意外结果。
例如下面的代码:
numbers = [1, 2, 3, 4, 5]
for number in numbers:
if number % 2 == 0:
numbers.remove(number)
print(numbers) # [1, 3, 5]
我们原本希望删除列表中的偶数,但是实际结果只删除了 2,3 和 5 的位置发生了改变。
解决这个问题的方法是,在循环中创建另一个列表,将需要删除的元素放入其中,循环结束后再删除这些元素。
numbers = [1, 2, 3, 4, 5]
to_remove = []
for number in numbers:
if number % 2 == 0:
to_remove.append(number)
for number in to_remove:
numbers.remove(number)
print(numbers) # [1, 3, 5]
或者使用列表推导式:
numbers = [1, 2, 3, 4, 5]
numbers = [number for number in numbers if number % 2 != 0]
print(numbers) # [1, 3, 5]
Python 字典常踩坑及解决方案
1、字典中的默认值可能和你期望的不一样
当你使用字典的 get() 方法获取不存在的键时,如果你没有为该键设置默认值,会返回 None。
例如:
my_dict = {'name': 'bob', 'age': 25}
print(my_dict.get('city')) # None
如果你希望 get() 方法返回的默认值是一个空字符串 '',那么你应该这样使用:
my_dict = {'name': 'bob', 'age': 25}
print(my_dict.get('city', '')) # ''
2、字典的键必须是不可变类型
字典的键必须是不可变类型,例如数字,字符串,元组。这是因为如果键是可变类型,那么修改该键的值会导致该键的哈希值发生变化,从而可能导致该键存储在字典中的位置发生变化,造成意外的结果。
例如:
my_dict = {['name']: 'bob', 'age': 25} # TypeError: unhashable type: 'list'
如果你希望使用可变类型作为键,那么你可以使用元组将可变类型转化为不可变类型:
my_dict = {('name',): 'bob', 'age': 25}
这样就可以将列表作为键了。
以上就是“Python 列表和字典常踩坑即解决方案”的完整攻略,希望对你有帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python 列表和字典常踩坑即解决方案 - Python技术站