我一直在努力管理一些数据。我有数据,我已经变成了列表列表,每个基本子列表具有如下结构
<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的机会,因为我认为这应该是一行功能可以处理的。
答案 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