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

3
如何在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
一个代码为什么非要一行解决呢?你现在的解决方案“可用”,那就用它呗。代码易读和功能性比一行解决更重要。 - g.d.d.c
1
@g.d.d.c -- 尤其是一行代码变得非常晦涩难懂的时候。不过,我相当确定 OP 的代码并不能“工作”(该函数没有返回任何内容,引用各种全局变量等)。 - mgilson
好的,你告诉我实现这个结果的最佳方法。 - Nishant Kashyap
你想将 None 转换为 ''。这样做会丢失信息,却没有任何好处。不清楚你为什么要这样做,更不清楚你为什么要在一行中完成它。 - msw
1
@msv 你怎么知道将 None 转换为 "" 对你没有任何帮助。在许多情况下,使用 "" 和 None 可能会有重大区别,OP 有权要求进行这样的更改。 - Jan Vlcinsky
伙计们。要求一行代码听起来像去健身房一样愚蠢。 - Jan Vlcinsky
2个回答

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(或任何其他评估为False的值)的情况来扩展它。

{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]

太棒了,这正是我在寻找的。谢谢!! - Nishant Kashyap

-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'}]

这几乎是我所知道的。 - Nishant Kashyap
实际上在Python3中,您可以安全地使用d.items(),因为它们是“视图”:https://docs.python.org/3/library/stdtypes.html#dictionary-view-objects - m.wasowski
@m.wasowski -- 您似乎是正确的。起初,我认为您不可能做到,因为它们是视图,但显然我错了... - mgilson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接