Чтение и группировка списка данных в Python - PullRequest
0 голосов
/ 27 марта 2009

Я боролся с управлением некоторыми данными. У меня есть данные, которые я превратил в список списков, каждый базовый подсписок имеет структуру, подобную следующей

<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

это продолжается неопределенное количество раз в каждом подсписке

РЕДАКТИРОВАТЬ Мне нужно выделить все вхождения <2, <3 & <4 и сгруппировать их вместе. Я создаю новый список списков [[<2x> value-1, <3x> value-2, < 4x> значение-3], [<2y> значение-1, <3y> значение-2, <4y> значение-3]]

РЕДАКТИРУЙТЕ все строки, которые следуют за <4x> и <4y> (и в этом отношении <4anyalpha> имеют одинаковый тип кодирования, и я априори не знаю, насколько высокими могут быть цифры - просто подумайте это не закрытые теги 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 ]

1 голос
/ 27 марта 2009

Если вы хотите выбрать второй, третий и четвертый элементы каждого подсписка, это должно работать:

listINeed = [sublist[1:4] for sublist in biglist]
1 голос
/ 27 марта 2009

itertools.groupby () может помочь вам.

itertools.groupby(biglist, operator.itemgetter(2))
1 голос
/ 27 марта 2009

Вы хорошо начали, заметив, что ваше оригинальное решение может работать, но ему не хватает элегантности.

Вы должны проанализировать строку в цикле, создавая новую переменную для каждой строки. Вот пример кода:

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
0 голосов
/ 27 марта 2009

Если я правильно понял ваш вопрос:

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

... выполнит эту работу за вас, если вы захотите использовать регулярные выражения.

В приведенной ниже версии все данные будут разбиты на подсписки (а не только первые четыре в каждой группе), что может быть более полезным в зависимости от того, что еще нужно сделать с данными. Используйте список DavidINeed = [sublist [1: 4] для подсписка в большом списке], чтобы получить первые четыре результата из каждого списка для указанной выше конкретной задачи.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...