【问题标题】:What is the best way in python to get a denormalized array from this ordered array?python中从这个有序数组中获取非规范化数组的最佳方法是什么?
【发布时间】:2011-01-22 20:13:59
【问题描述】:

我有这个数组:

>>> print raw_data
['LEVEL 1',
'SUBJECT A',
'GROUP X',
'COMMENT i',
'COMMENT ii',
'COMMENT iii',
'GROUP Y',
'COMMENT iv',
'COMMENT v',
'COMMENT vi',
'LEVEL 2',
'SUBJECT B',
'GROUP Z',
'COMMENT vii',
'COMMENT viii',
'COMMENT ix',
'SUBJECT C',
'GROUP X2',
'COMMENT x',
'COMMENT xi',
'COMMENT xii',
'COMMENT xiii',
'GROUP Y2',
'COMMENT xiv',
'COMMENT xv',
'COMMENT xvi']

明显的层次结构在哪里:

  1. 等级
    1. 主题
        1. 评论

我的目标是将数组作为非规范化数组存储在数据库中:

>>> print result
[
    ['LEVEL 1', 'SUBJECT A', 'GROUP X', 'COMMENT i'],
    ['LEVEL 1', 'SUBJECT A', 'GROUP X', 'COMMENT ii'],
    ['LEVEL 1', 'SUBJECT A', 'GROUP X', 'COMMENT iii'],
    ['LEVEL 1', 'SUBJECT A', 'GROUP Y', 'COMMENT iv'],
    ['LEVEL 1', 'SUBJECT A', 'GROUP Y', 'COMMENT v'],
    ['LEVEL 1', 'SUBJECT A', 'GROUP Y', 'COMMENT vi'],
    ['LEVEL 2', 'SUBJECT B', 'GROUP Z', 'COMMENT vi'],
    ['LEVEL 2', 'SUBJECT B', 'GROUP Z', 'COMMENT vii'],
    ['LEVEL 2', 'SUBJECT B', 'GROUP Z', 'COMMENT viii'],
    ['LEVEL 2', 'SUBJECT B', 'GROUP Z', 'COMMENT ix'],
    ['LEVEL 2', 'SUBJECT C', 'GROUP X1', 'COMMENT x'],
    ['LEVEL 2', 'SUBJECT C', 'GROUP X1', 'COMMENT xi'],
    ['LEVEL 2', 'SUBJECT C', 'GROUP X1', 'COMMENT xii'],
    ['LEVEL 2', 'SUBJECT C', 'GROUP X1', 'COMMENT xiii],'
    ['LEVEL 2', 'SUBJECT C', 'GROUP Y2', 'COMMENT xiv'],
    ['LEVEL 2', 'SUBJECT C', 'GROUP Y2', 'COMMENT xv'],
    ['LEVEL 2', 'SUBJECT C', 'GROUP Y2', 'COMMENT xi']
]

我试图解决这个问题,但我很迷茫,我认为这个问题必须是常见的,所以我想知道是否有人有一个有效的方法,这似乎是嵌套集合,但我没有在 python 上不太了解,获得关卡很容易,但我越来越“头疼”了。

>>> def addlevel(a):
    if a.startswith('LEVEL'):
        return [1, a]
    elif a.startswith('SUBJECT'):
        return [2, a]
    elif a.startswith('GROUP'):
        return [3, a]
    elif a.startswith('COMMENT'):
        return [4, a]
>>> map(addlevel, raw_data)
[[1, 'LEVEL 1'],
 [2, 'SUBJECT A'],
 [3, 'GROUP X'],
 [4, 'COMMENT i'],
 [4, 'COMMENT ii'],
 [4, 'COMMENT iii'],
 [3, 'GROUP Y'],
 [4, 'COMMENT iv'],
 [4, 'COMMENT v'],
 [4, 'COMMENT vi'],
 [1, 'LEVEL 2'],
 [2, 'SUBJECT B'],
 [3, 'GROUP Z'],
 [4, 'COMMENT vii'],
 [4, 'COMMENT viii'],
 [4, 'COMMENT ix'],
 [2, 'SUBJECT C'],
 [3, 'GROUP X2'],
 [4, 'COMMENT x'],
 [4, 'COMMENT xi'],
 [4, 'COMMENT xii'],
 [4, 'COMMENT xiii'],
 [3, 'GROUP Y2'],
 [4, 'COMMENT xiv'],
 [4, 'COMMENT xv'],
 [4, 'COMMENT xvi']]

我会很感激任何线索!

【问题讨论】:

    标签: python arrays roman-numerals


    【解决方案1】:

    伪代码,目前没有方便的 python 解释器:

    Set LEVEL, SUBJECT, GROUP to None, results to []
    
    Loop over the list
      if its a 'LEVEL', set LEVEL to it
      if its a 'SUBJECT', set SUBJECT to it
      if its a 'GROUP', set GROUP to it
      if its a "COMMENT", append [LEVEL SUBJECT GROUP and COMMENT] to results
    Ta-da.
    

    它只是依赖于排序...

    【讨论】:

    • Python 中应该有一个Ta-da 命令。 :) 无论如何,好的 sn-p。
    【解决方案2】:

    你可以试试这样的:

    raw_data = [ 'LEVEL 1', 'SUBJECT A', 'GROUP X', 'COMMENT i', 'COMMENT ii',
    'COMMENT iii', 'GROUP Y', 'COMMENT iv', 'COMMENT v', 'COMMENT vi', 'LEVEL 2',
    'SUBJECT B', 'GROUP Z', 'COMMENT vii', 'COMMENT viii', 'COMMENT ix', 
    'SUBJECT C', 'GROUP X2', 'COMMENT x', 'COMMENT xi', 'COMMENT xii', 
    'COMMENT xiii', 'GROUP Y2', 'COMMENT xiv', 'COMMENT xv', 'COMMENT xvi' ]
    
    level, subject, group, comment = '', '', '', ''
    
    result = []
    
    for item in raw_data:
    
        if item.startswith('COMMENT'): 
            comment = item
        elif item.startswith('GROUP'): 
            group = item
            comment = ''
        elif item.startswith('SUBJECT'): 
            subject = item
            group = ''
        elif item.startswith('LEVEL'): 
            level = item
            subject = ''
    
        if level and subject and group and comment:
            result.append([level, subject, group, comment])
    
    import pprint
    pprint.pprint(result)
    

    这会产生:

    [['LEVEL 1', 'SUBJECT A', 'GROUP X', 'COMMENT i'],
     ['LEVEL 1', 'SUBJECT A', 'GROUP X', 'COMMENT ii'],
     ['LEVEL 1', 'SUBJECT A', 'GROUP X', 'COMMENT iii'],
     ['LEVEL 1', 'SUBJECT A', 'GROUP Y', 'COMMENT iv'],
     ['LEVEL 1', 'SUBJECT A', 'GROUP Y', 'COMMENT v'],
     ['LEVEL 1', 'SUBJECT A', 'GROUP Y', 'COMMENT vi'],
     ['LEVEL 2', 'SUBJECT B', 'GROUP Z', 'COMMENT vii'],
     ['LEVEL 2', 'SUBJECT B', 'GROUP Z', 'COMMENT viii'],
     ['LEVEL 2', 'SUBJECT B', 'GROUP Z', 'COMMENT ix'],
     ['LEVEL 2', 'SUBJECT C', 'GROUP X2', 'COMMENT x'],
     ['LEVEL 2', 'SUBJECT C', 'GROUP X2', 'COMMENT xi'],
     ['LEVEL 2', 'SUBJECT C', 'GROUP X2', 'COMMENT xii'],
     ['LEVEL 2', 'SUBJECT C', 'GROUP X2', 'COMMENT xiii'],
     ['LEVEL 2', 'SUBJECT C', 'GROUP Y2', 'COMMENT xiv'],
     ['LEVEL 2', 'SUBJECT C', 'GROUP Y2', 'COMMENT xv'],
     ['LEVEL 2', 'SUBJECT C', 'GROUP Y2', 'COMMENT xvi']]
    

    【讨论】:

    • 简单!我试图做一些与嵌套集相关的事情,但这似乎更简单
    • 错误! ` ['LEVEL 2', 'SUBJECT A', 'GROUP Y', 'COMMENT vi'], ` 不应出现在结果中。对于找到的每个级别,您需要清除所有子级别。
    • @Paul 感谢您发现错误(以及 pyparsing,顺便说一句;) - 更正了我的帖子。
    猜你喜欢
    • 2010-09-25
    • 2012-09-12
    • 2021-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多