Python 一行代码实现两个嵌套的 for 循环
如何在Python中用一行代码得到想要的结果呢?
object_list=[{'applicationName': "ATM Monitoring",
'roamingDrop': "",
'noOfCustomer': None,
'ipAddress': "192.168.1.1",
'url': "www.google.co.in",},
{'applicationName': None,
'roamingDrop': "",
'noOfCustomer': None,
'ipAddress': "192.168.1.1",
'url': "www.google.co.in",}]
我们需要的结果是把所有的None替换成空字符串""。
object_list=[{'applicationName': "ATM Monitoring",
'roamingDrop': "",
'noOfCustomer': "",
'ipAddress': "192.168.1.1",
'url': "www.google.co.in",},
{'applicationName': "",
'roamingDrop': "",
'noOfCustomer': "",
'ipAddress': "192.168.1.1",
'url': "www.google.co.in",}]
实现这个功能的简单函数是:
def simple():
for object in object_list:
for key, value in object.iteritems():
if value:
dict( object, **{key: value})
else:
dict(object, **{key: ''})
还有一个不成功的Python一行代码:
[dict(object, **{key: value}) if value else dict(object, **{key: ''})
for object in object_list for key, value in object.iteritems()]
能不能用列表推导式来实现这一行代码呢?
2 个回答
-1
这看起来挺简单的:
>>> for d in object_list:
... for k, v in d.items():
... if v is None:
... d[k] = ''
...
接下来我们来看看输出结果是什么样的:
>>> import pprint
>>> pprint.pprint(object_list)
[{'applicationName': 'ATM Monitoring',
'ipAddress': '192.168.1.1',
'noOfCustomer': '',
'roamingDrop': '',
'url': 'www.google.co.in'},
{'applicationName': '',
'ipAddress': '192.168.1.1',
'noOfCustomer': '',
'roamingDrop': '',
'url': 'www.google.co.in'}]
4
lst=[{'applicationName': "ATM Monitoring",
'roamingDrop': "",
'noOfCustomer': None,
'ipAddress': "192.168.1.1",
'url': "www.google.co.in",},
{'applicationName': None,
'roamingDrop': "",
'noOfCustomer': None,
'ipAddress': "192.168.1.1",
'url': "www.google.co.in",}]
print [{key: val if val else "" for key, val in dct.items()} for dct in lst]
解释:
dct = lst[0]
{'applicationName': "ATM Monitoring",
'roamingDrop': "",
'noOfCustomer': None,
'ipAddress': "192.168.1.1",
'url': "www.google.co.in",}
使用字典推导(从Python 2.7开始就有这个功能),首先是把字典重建成相同的值:
{key: val for dct.items()}
然后通过赋值""来扩展它,以防原来的值是None(或者其他任何被认为是假的值)
{key: val if val else "" for dct.items()}
最后(如上所示),它被应用到列表推导中,针对列表里的所有项目。
{key: val for dct.items()}
严格来说,这会把任何看起来像布尔值False的东西替换成""。
如果我们只想把None
的值替换成""
,而像False
和0
保持不变,那我们就需要更严格一些:
print [{key: val if val is not None else "" for key, val in dct.items()} for dct in lst]