2009-03-27 6 views
0

私はいくつかのデータの管理に苦労しています。私は、それぞれの基本的なサブリストは、これは、各サブリストに倍の不確定数のため、私はすべてを取得する必要がありPythonのデータリストの読み込みとグループ化

EDITを続けて、次の

<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の出現、 < 4は一緒に私はリストの新しいリストを作成していて分離し、グループ化された[[< 2倍>値-1、< 3X>値-2、< 4X>値-3]、[< 2Y > value-1、< 3y> value-2,< 4y> value-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='' 

ではありません私はこれをクリーンアップしようとする方法を見てきましたが、成功していません。これはうまくいきました。これは、これを1行の関数で処理できると思うので、これをPythonについてもっと学ぶ別の機会として見ました。

+0

あなたの質問を編集して、あなたが望むもののより良い説明を与えることができれば助かります。あなたが今のところそれを持っているかどうかは分かりません。 –

+0

リストのリストの場合は、なぜ「<1x> blah」表記でそれを表示していますか?リストの本当のリストとして表示してみませんか? [[1、x、blah]、[2、x、value-1]、...]あなたは本当に何を持っていますか?文字列のリスト?どうして? –

+0

ソースファイルがどのようになったのかが分かるからです。私はソースファイルを読み込んでおり、処理するものを特定するために使用しなければならない各行の冒頭にタグがあります。各ソースファイルはサブリストです。この表記は、各行がSGMLタグで始まっているからです。 – PyNEwbie

答えて

1

itertools.groupby()をすることによって、あなたを得ることができます。

itertools.groupby(biglist, operator.itemgetter(2)) 
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 
+0

私はあなたの創造性に感謝しますが、私のソリューションは実装が安いと思いますが、私は絶対にはわかりません。約750Kの回線に対して2秒以下で実行されました。 – PyNEwbie

+0

「実装するのが安い」ということは、あなたのアプローチがより速く実行されることを意味します。あなたのアプローチは、4つではなく5つの変数がある場合でも壊れます。私のソリューションが動作する必要がない場合、私はあなたが望むほど速く動くようにすることができます。 – RossFabricant

+0

私の解決策の1つの問題は、変数が順不同であった場合、それがうまくいかない場合です。しかし、私の解決策は、5つまたはnの変数で正常に動作します、私はそれらを定義する必要があります。私は1つのライナーが間違っていたと思う。私はあなたのコードから多くを学びました – PyNEwbie

1

、および各サブリストの第四の要素、これは動作するはずです:: はここにいくつかのサンプルコードです

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

彼らはどのものなのか確かめられませんでした。そこに掲載された全部がサブリストになっていますので、そこには1〜10個のユニットが必要です。 – PyNEwbie

+0

あなたの質問にもっと具体的に...私は本当にあなたがしようとしていることを正確に理解できません。 –

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 

...あなたは正規表現を使用したように感じた場合は、あなたのための仕事をするだろう。

以下のバージョンでは、すべてのデータをサブリスト(個々のグループの最初の4つだけでなく)に分割します。上記の特定のタスクの各リストから最初の4つの結果を取得するには、DavidのlistINeed = [biglistのサブリストのための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 
関連する問題