Python 一行代码实现两个嵌套的 for 循环

3 投票
2 回答
5755 浏览
提问于 2025-04-18 06:35

如何在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的值替换成"",而像False0保持不变,那我们就需要更严格一些:

print [{key: val if val is not None else "" for key, val in dct.items()} for dct in lst]

撰写回答