十八、列表和字典的坑(循环不能删减其中的元素)
一、列表的坑
#l1 = [11, 22, 33, 44, 55]
# 索引为奇数对应的元素删除(不能一个一个删除,此l1只是举个例子,里面的元素不定)。
#正常思路:先将所有的索引整出来,加以判断,index % 2 == 1: pop(index)
l1 = [11, 22, 33, 44, 55]
for index in range(len(l1)):
if index % 2 == 1:
l1.pop(index)
print(l1)
#得到的结果却为[11, 33, 44],这不是正确的结果,是因为在删除22的时候,改变了列表后边的元素的索引,整体向前移动一位,导致这样的结果
# 最简单的方法:
l1 = [11, 22, 33, 44, 55]
del l1[1::2]
print(l1)
# 倒序法删除元素:
l1 = [11, 22, 33, 44, 55]
for index in range(len(l1)-1,-1,-1):
if index % 2 == 1:
l1.pop(index)
print(l1)
# 思维置换
l1 = [11, 22, 33, 44, 55]
l2 = []
for index in range(len(l1)):
if index % 2 == 0:
l2.append(l1[index])
l1 = l2
print(l1)
#所以: 循环一个列表的时,最好不要改变列表的大小,这样会影响你的最终的结果。
二、字典的坑
#dic = {'k1': '太白', 'k2': 'barry', 'k3': '白白', 'age': 18}
# 将字典中键含有'k'元素的键值对删除。
#正常思路:先找出字典中所有的键,如果键中有k,则将含有'k'元素的键值对删除。
dic = {'k1': '太白', 'k2': 'barry', 'k3': '白白', 'age': 18}
for key in dic:
if 'k' in key:
dic.pop(key)
print(dic)
#此时,字典会直接报错,是RuntimeError: dictionary changed size during iteration,即为字典在循环迭代时,改变了大小。
#建立空列表,把字典中带k的键找出来放在列表里,遍历循环列表,只要出现在列表中的,字典中删除键对应的值
dic = {'k1': '太白', 'k2': 'barry', 'k3': '白白', 'age': 18}
l1 = []
for key in dic:
if 'k' in key:
l1.append(key)
print(l1) #['k1', 'k2', 'k3']
for i in l1:
dic.pop(i)
print(dic) #{'age': 18}
#直接在取字典中的键时,直接list(dic.keys()),省一个for循环
dic = {'k1': '太白', 'k2': 'barry', 'k3': '白白', 'age': 18}
for key in list(dic.keys()): # ['k1', 'k2', 'k3','age']
if 'k' in key:
dic.pop(key)
print(dic)