Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中,从这个有序数组获得非规范化数组的最佳方法是什么?_Python_Arrays_Roman Numerals - Fatal编程技术网

在python中,从这个有序数组获得非规范化数组的最佳方法是什么?

在python中,从这个有序数组获得非规范化数组的最佳方法是什么?,python,arrays,roman-numerals,Python,Arrays,Roman Numerals,我有这个阵列: >>> 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', 'SUB

我有这个阵列:

>>> 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']
其中明显的层次结构是:

  • 水平仪
  • 主题
  • 团体
  • 评论
  • 我的目标是将数组作为非规范化数组存储在数据库中:

    >>> 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解释器:

    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.
    

    它只依赖于排序…

    您可以尝试以下方法:

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

    Python中应该有一个
    Ta da
    命令。:)总之,这段代码很好,很简单!我试图做一些与嵌套集相关的事情,但这似乎更简单['LEVEL 2'、'SUBJECT A'、'GROUP Y'、'COMMENT vi']、`不应出现在结果中。对于找到的每个级别,您都需要删除所有的子级别。@Paul感谢您发现了这个错误(顺便说一句,还有pyparsing;)-更正了我的帖子。