问题:
如有你有这样的一个字典数据,如下:
data = {'name': 'Jack', 'mobile': '12345678911', 'address': '', 'ID': '', }
1
2
3
4
5
6
|
data
=
{
'name'
:
'Jack'
,
'mobile'
:
'12345678911'
,
'address'
:
''
,
'ID'
:
''
,
}
|
请问应该如何删除值为空的键值对?
错误答案:
for k in data.keys(): if not data[k]: del data[k]
1
2
3
4
|
for
k
in
data
.
keys
(
)
:
if
not
data
[
k
]
:
del
data
[
k
]
|
以上代码能够完成我的问题吗?思考一分钟再回答是否正确!!!
答案:错!!! 会报如下错误:
Traceback (most recent call last): File "<stdin>", line 1, in <module> RuntimeError: dictionary changed size during iteration
1
2
3
4
|
Traceback
(
most
recent
call
last
)
:
File
"<stdin>"
,
line
1
,
in
<
module
>
RuntimeError
:
dictionary
changed
size
during
iteration
|
报错意思:字典在迭代期间有改变
正确答案:
for k in list(data.keys()): if not data[k]: del data[k]
1
2
3
4
|
for
k
in
list
(
data
.
keys
(
)
)
:
if
not
data
[
k
]
:
del
data
[
k
]
|
细心的朋友会发现,这里我们对data.keys()做了一个list()操作,请大家想想为什么要做这样的一个操作呢?
解答
因为在python3中dict.keys()是一个迭代器。迭代器在操作过程中,是不允许被修改的。所以我们要把迭代器(data.keys()),改为一个list(非迭代器),这样我们就可以对字典操作了。 其实这里我们通过list()已经把for循环迭代的对象,由原来的data.keys()变为了一个由data.keys()组成的一个list()数据了。
1
2
|
因为在
python3中
dict
.
keys
(
)是一个迭代器。迭代器在操作过程中,是不允许被修改的。所以我们要把迭代器(
data
.
keys
(
)),改为一个
list(非迭代器),这样我们就可以对字典操作了。
其实这里我们通过
list
(
)已经把
for循环迭代的对象,由原来的
data
.
keys
(
)变为了一个由
data
.
keys
(
)组成的一个
list
(
)数据了。
|
疑问
请问,python3中的字典,是有序的数据,还是无序的数据?
欢迎大家留言回答!!!