首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >设置大列表理解格式的最佳实践?

设置大列表理解格式的最佳实践?
EN

Stack Overflow用户
提问于 2021-10-17 15:52:33
回答 3查看 275关注 0票数 0

我有一个相当大的对象集合,其中只需要4个数据点,它们看起来如下所示:

代码语言:javascript
复制
{
    'date': '01/01/1900'
    'info': {'contact': 'Jane Doe',
             'id': 298342,
             'address': '123 Street Rd.'},
    'account': {'name': 'Random Event Name',
                'id': 9623075},
    'guest_count': 523,
    'rooms': [{'name': 'Room A',
               'id': 209353,
               'capacity': 300},
              {'name': 'Room B',
               'id': 630923,
               'capacity': 50}],
    'start_time': '10:00:00',
    'end_time': '15:45:00',
              .
              .
              .
}

我有一个简单的for循环来迭代对象并提取我需要的信息:

代码语言:javascript
复制
info = []
for event in events:

    start_time = event['start_time']

    location = 'Offsite' if event['rooms'][0]['name'] == 'Offsite' else 'In-House'

    name = event['account']['name']

    guest_count = event['guest_count']

    info.append([start_time, location, name, guest_count])

然后,我将其转换为以下列表理解:

代码语言:javascript
复制
info = [[event['start_time'], 'Offsite' if event['rooms'][0]['name'] == 'Offsite' else 'In-House', event['account']['name'], event['guest_count']] for event in events['results']]

这显然违反了80个字符规则,似乎找不到任何关于如何格式化变量重列表理解的文档。

这就是我最后所做的,但它仍然显得相当丑陋:

代码语言:javascript
复制
sanitized_events = [
    [event['start_time'], 
    'Offsite' if event['rooms'][0]['name'] == 'Offsite' else 'In-House', 
    event['account']['name'], 
    event['guest_count']] for event in events]
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-10-17 15:55:48

有些代码不应该折叠成列表理解。如果你尝试,它似乎变得更加复杂,那么它是值得问一问,这是否是一条正确的道路开始。

需要考虑的一条路径始终是一个辅助函数。

代码语言:javascript
复制
def _sanitize(event):
  location = 'Offsite' if event['rooms'][0]['name'] == 'Offsite' else 'In-House'
  return (event['start_time'],
          location,
          event['account']['name'],
          event['guest_count'])

sanitized_events = [_sanitize(event) for event in events]

这就将列表创建的逻辑从处理过程中分割开来,从而使得更容易理解高层次的思想,并且能够在需要时跳到细节。

票数 2
EN

Stack Overflow用户

发布于 2021-10-17 16:14:59

我会这样做:

代码语言:javascript
复制
info = [[event['start_time'],
         'Offsite' if event['rooms'][0]['name'] == 'Offsite' else 'In-House',
         event['account']['name'],
         event['guest_count']] for event in events['results']]

我认为这是可读的-够了。

最大线长PEP 8覆盖。请注意上面写着:

有些队伍非常喜欢较长的队伍。对于完全或主要由能够就此问题达成一致意见的团队维护的代码,可以将行长限制增加到99个字符,前提是注释和文档字符串仍然包装为72个字符。

因此,您并不局限于<80个字符(用于代码)。我个人发现,我使用的几乎所有工具都能很好地使用90种工具(而且巧合的是,在网站上发布代码时也是如此)。

票数 0
EN

Stack Overflow用户

发布于 2021-10-17 17:03:06

代码语言:javascript
复制
sanitized_events = \
[
    [ 
        event['start_time'],      
        
        'Offsite' if (event ['rooms'][0]['name'] == 'Offsite')
        else 'In-House',
                                
        event['account']['name']  
    ], 

    event['guest_count']
    
    for event in events
]

对于嵌套的复杂结构,最好使用c语言中用于块的相同约定:开括号和尾括号有自己的行,匹配的括号位于同一列中。列表的内容是缩进的。

另外,用空行包围多行项。可以选择用空行将for子句与项分开。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69606067

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档