2017-09-13 8 views
0

私はPythonに詳しくはありませんが、私は何かする必要があります。私はいくつかの列のASCIIファイル(スペース区切り)を持っています。最初の列では、いくつかの値が重複しています。これらの重複値から、例えば第3列で大きな値を持つ行を選択し、配列を戻す必要があります。 私はこのような何か希望:私はpython列の最大値に基づいて行を選択してください

(全ての第2のエントリ)重複のインデックスを検出するための補助機能を定義した:

#col1 col2 col3 col4 col5 
1   1  2  3  4 
1   2  1  5  3 
2   2  5  2  1 

ライン1と3 を返しますが、ここで私はこれまでにしたものです

def list_duplicates(seq): 
    seen = set() 
    seen_add = seen.add 
    return [idx for idx,item in enumerate(seq) if item in seen or seen_add(item)] 

し、リストを読むためにそれを使用してみてください(私は、各列に名前を付けるnp.genfromtxt持つファイルからロードされていること)

def select_high(ndarray, dup_col, sel_col): #dup_col is the column where the duplicates are, sel_col is the column where we select the larger value 
    result = [] 
    dup = list_duplicates(ndarray[dup_col]) 
    dupdup = [x-1 for x in dup] 
    for i in range(len(ndarray[sel_col])):   
     if i in dup: 
      mid = [] 
      maxi = max(ndarray[sel_col][i], ndarray[sel_col][i-1]) 
      maxi_index = np.where(ndarray[sel_col] == maxi)[0][0] 
      for name in ndarray.dtype.names: 
       mid.append(ndarray[name][maxi_index]) 
      result.append(mid) 
     else: 
      mid = [] 
      if i not in dupdup: 
       for name in ndarray.dtype.names: 
        mid.append(ndarray[name][i]) 
      result.append(mid) 

    return np.asarray(result) 

が、何が起こっているのかは重複があるときはいつでもelseの部分を削除しなければならない、それとも私にエラーが出る、重複がないときはいつでも戻す必要があるということです。 何か助けていただければ幸いです。長い投稿を申し訳ありません。私は自分自身を明確にすることを願っています。

+0

を 'col3'に、我々はこれらのアイテムを持つことになります場合、結果は何をする必要があります:' 1,2,3,2,1,4を、 5?それはmin要素より大きいすべての項目でなければなりませんか? – AndMar

+0

あなたの質問に表示されているエラーを追加できますか?デバッグがはるかに簡単になります。 – mfitzp

答えて

0

あなたは細部に(そして私も)迷っていると思います。ここで何をしたいんバージョンがあるが、より簡単です:

m = [[1, 2, 1, 5, 3], [1, 1, 2, 3, 4], [2, 2, 5, 2, 1]] 
s = sorted(m, key=lambda r:(r[0], -r[2])) 
print(s) 
seen = set() 
print([r for r in s if r[0] not in seen and not seen.add(r[0])]) 

1行目には、ファイルから取得する行のリストとしてm定義します。

2行目は、第3列の値に、最初の列(r[0])の値にこれらの行をソートし、より小さな値(-r[2])に大きなから:

s=[[1, 1, 2, 3, 4], [1, 2, 1, 5, 3], [2, 2, 5, 2, 1]] 

今最初の列の値を少なくとも1回見たときに行をスキップする必要があります。我々はすでに見たr[0]の値を格納するために、セットseenを使用します。 r[0]seenにない場合は、次の行が表示されたときにその行を破棄するように、行を保持してseenに配置する必要があります。r[0]それは少しトリッキーです:

if r[0] not in seen and not seen.add(r[0]) 

seen.addNoneを返すためnot seen.add(r[0])は、常に真であること。したがって:

  • r[0]seenにない場合、我々はseenr[0]を入れて

  • 行を保つr[0]seenであれば、我々はfalseを返すと行を破棄します。

あなたもそのように表現できる:

if not (r[0] in seen or seen.add(r[0])) 
+0

ありがとう、これはうまくいくと思われ、それは私が思ったよりもはるかに簡単です。私は本当に不必要に問題を複雑にしていました。私はおそらく擬似コードで質問を言い換えるべきではないかと思う。 – bernie

+0

@bernieあなたは高水準のPythonを使用しています:低レベルの懸案事項であなたのプログラムを複雑にするのを避けるためにいくつかの練習が必要です。言いましたが、私のコードはソートを意味し、あなたが期待したもの(* O(n lg n)*可能なO(n)*時間の複雑さ)よりも遅くなるかもしれません。 – jferard

関連する問題