2016-05-24 1 views
1

リストを並べ替えようとしていますが、最初にdocumentとしてからstartPosをソートしようとしています。 これは私のコードの抽出物が2つの要素でリストをソートしたいが、範囲外になっている

#!/usr/bin/env python 


     if tokens[0] == tokens2[0]: 
      document = tokens[1] 
      startPos = tokens[2] 
      endPos = tokens[3] 
      s = [] 
      if document not in s: 
       s.append(document) 
      if startPos not in s: 
       s.append(startPos) 
      if endPos not in s: 
       s.append(endPos) 
      li = s 
      sorted(li, key = operator.itemgetter(0,1)) 
      print >> fmatches, li 

私は理想的

File "./match.py", line 48, in <module> 
    sorted(li, key = operator.itemgetter(0,1)) 
IndexError: string index out of range 

を取得していますが、私は持っていると思います。私が間違ってやっている何

['source-document01211.txt', '4842', '4851'] 
['source-document01222.txt', '3162', '3171'] 
['source-document01222.txt', '20802', '20811'] 
['source-document01229.txt', '32586', '32595'] 
['source-document01245.txt', '8670', '8679'] 

+0

'sorted()'はインプレースで動作しないので、その行は役に立たないものです。 – TigerhawkT3

+0

それはどういう意味ですか? – robins02

+1

** sorted **は新しいオブジェクトを返し、引数として与えたオブジェクトをソートします。使用しようとしているパラメータは**ソート**のためのものです。 ** li.sort(...)**を代わりに使用することもできます。 – Prune

答えて

1

あなたのコードを完全に理解していないと(私はそれがほぼ現時点では役に立たないと思いますが)、いくつかの問題もあります。私は、あなたが扱っているデータ、目的のアウトプット(途中でソートされていないがおそらくあったはずです)とあなたのprevious questionに基づいて、いくつかの推測を推測しています。

私は各リストs[document, startPos, endPos]のレコードを表していると仮定しています。これらのレコードを最初に集めて、これらすべてをliに保存したいとしますか?私はさらにあなたの最終目標が、すべてのレコードを並べ替えてliに並べ替えることを前提としています。

の問題は、あなたが現時点で持っている:

  • sorted(li)がソートされたリストを返しますがli自体は変更されません。あなたが何かに結果を割り当てなかったので、あなたのラインは今のところほとんど何もしていません。
  • リストはおそらく(ちょうどもちろん推測...)をソートするときに数値としてstartPosを解釈したいが、それは文字列として指定され
  • ...、ゼロインデックスベースの意味document = s[0]startPos = s[1]です。あなたの全体のスクリプトは、おそらく多少さらに単一のコード行に減少させることができた

    li = [] 
    for tokens in some_token_list: 
        s = [token[i] for i in range(1, 4)] 
        li.append(s) 
    
    li.sort(key=lambda elem: (int(elem[1]), int(elem[2]))) 
    

    のように見えることを意図している

    li = [['source-document01211.txt', '4842', '4851'], 
         ['source-document01222.txt', '3162', '3171'], 
         ['source-document01222.txt', '20802', '20811'], 
         ['source-document01229.txt', '32586', '32595'], 
         ['source-document01245.txt', '8670', '8679']] 
    
    li.sort(key=lambda tup: (tup[0], int(tup[1]))) 
    

    :以下は、このすべてを達成し

に物事を追加する前にs = []を設定しているので、リストに何かがあるかどうかを確認する必要はありません。それは定義上空です!あなたはおそらく上記のように書くことを意味するs = [token[i] for i in range(1, 4)](あなたは常に3つのアイテムが必要と仮定)。

また、私は完全にオフかもしれませんが、私はそうではないと思います。

+0

うわー、あなたはほとんどのものを爪にぶつけてしまいました。 さて、source-text.txtとsusp-textという2つのテキストがあります。txtと私は比較するために、このスクリプトでそれらを開き、一致するパターンがあるかどうかを確認し、ソース文書、パターンの開始位置と終了位置を印刷したい。 既存のリストがないので問題はないので、私は 'some_token_list'をどのように使用するのか分かりません – robins02

+0

ヒントを与えるために、スクリプトの開始は次のようなものです:*編集OP * – robins02

+0

あなたはおそらくファイルからこれらを抽出しました。私の答えは、あなたに完全な解決策を与えることを目的とするものではなく、どのように進めるべきかについてのアイディアを提供することを目的としています。結局のところ、Stackoverflowは「私の全コードを私のために書いてください」というようなものではありません。 –

関連する問題