在Python中读取和分组数据列表

时间:2009-03-27 03:45:46

标签: python list

我一直在努力管理一些数据。我有数据,我已经变成了列表列表,每个基本子列表具有如下结构

<1x>begins
<2x>value-1
<3x>value-2
<4x>value-3
 some indeterminate number of other values
<1y>next observation begins
<2y>value-1
<3y>value-2
<4y>value-3
 some indeterminate number of other values

这在每个子列表中持续不确定次数

编辑我需要得到所有出现的&lt; 2,&lt; 3&amp; &lt; 4分离并组合在一起我创建了一个新的列表列表[[&lt; 2x&gt; value-1,&lt; 3x&gt; value-2,&lt; 4x&gt; value-3],[&lt; 2y&gt; value- 1,&lt; 3y&gt; value-2,&lt; 4y&gt; value-3]]

编辑后面的所有行&lt; 4x&gt;和&lt; 4y&gt; (并且对于那个问题&lt; 4anyalpha&gt;具有相同类型的编码并且我不知道数字可以有多高 - 只是将这些视为未关闭的sgml标签我使用数字因为我的手指在受伤来自我今天所做的所有编码。

我最终提出的解决方案并不是很漂亮

 listINeed=[]
 for sublist in biglist:
    for line in sublist:
        if '<2' in line:
            var2=line
        if '<3' in line:
            var3=line
        if '<4' in line:
            var4=line
            templist=[]
            templist.append(var2)
            templist.append(var3)
            templist.append(var4)
            listIneed.append(templist)
            templist=[]
            var4=var2=var3=''

我已经研究过如何尝试清理它但没有成功的方法。这很好,我刚看到这是另一个了解python的机会,因为我认为这应该是一行功能可以处理的。

4 个答案:

答案 0 :(得分:1)

通过注意到您的原始解决方案可行但缺乏优雅,您已经有了一个良好的开端。

您应该在循环中解析字符串,为每一行创建一个新变量。 这是一些示例代码:

import re

s = """<1x>begins
<2x>value-1
<3x>value-2
<4x>value-3
 some indeterminate number of other values
<1y>next observation begins
<2y>value-1
<3y>value-2
<4y>value-3"""
firstMatch = re.compile('^\<1x')
numMatch = re.compile('^\<(\d+)')
listIneed = []
templist = None
for line in s.split():
        if firstMatch.match(line):
                if templist is not None: 
                        listIneed.append(templist)
                templist = [line]
        elif numMatch.match(line):
            #print 'The matching number is %s' % numMatch.match(line).groups(1)
            templist.append(line)
if templist is not None: listIneed.append(templist)

print listIneed

答案 1 :(得分:1)

如果你想挑选每个子列表的第二,第三和第四个元素,这应该有效:

listINeed = [sublist[1:4] for sublist in biglist]

答案 2 :(得分:1)

itertools.groupby()可以帮助你。

itertools.groupby(biglist, operator.itemgetter(2))

答案 3 :(得分:0)

如果我理解你的问题:

import re
def getlines(ori):
    matches = re.finditer(r'(<([1-4])[a-zA-Z]>.*)', ori)
    mainlist = []
    sublist = []
    for sr in matches:
        if int(sr.groups()[1]) == 1:
            if sublist != []:
                mainlist.append(sublist)
            sublist = []
        else:
            sublist.append(sr.groups()[0])
    else:
        mainlist.append(sublist)
    return mainlist
如果您想使用正则表达式,那么

...会为您完成工作。

下面的版本会将所有数据分解为子列表(不仅仅是每个分组中的前四个),这可能会更有用,这取决于您需要对数据做什么。使用David的listINeed = [sublist [1:4]作为biglist中的子列表]从上面的特定任务的每个列表中获取前四个结果。

import re
def getlines(ori):
    matches = re.finditer(r'(<(\d*)[a-zA-Z]>.*)', ori)
    mainlist = []
    sublist = []
    for sr in matches:
        if int(sr.groups()[1]) == 1:
            print "1 found!"
            if sublist != []:
                mainlist.append(sublist)
            sublist = []
        else:
            sublist.append(sr.groups()[0])
    else:
        mainlist.append(sublist)
    return mainlist