1

いくつかの値があるとします: (左の列は値の数です: 1、2、3 など; 右は実際の値です)

1 5.2
2 1.43
3 3.54
4 887
5 0.35

私がやりたいことは、値を減少から増加 (トップダウン) に並べ替えることです。次に、Python に値を調べさせ、値を選択し続けさせたいと思います (後で出力として使用します)。あるしきい値以上の値。例えば:

5 0.35
2 1.43
3 3.54
1 5.2
4 887

たとえば、しきい値が 5.0 であるため、ここではプログラムで 1 と 4 (高い値) を破棄し、5、2、3 を対応する値と共に出力として指定します。それが理にかなっていることを願っています。また、(何らかの理由で) しきい値が 2 つの値しか許可しない場合、よりトリッキーなトリックとして、すべてを無視して「値が見つかりません」のようなものを与えたいと思います。

それらが配置されているファイル(値とカウント)を取得するファイルは、おおよそ次のようになります。

  ID  some: value  another: value another: value another: value another: value another: value 1: 5.2

など、上記の各値はファイルの新しい行に対応します。したがって、私が興味を持っているものは、それぞれ行 x、列 14、および 15 にあります。

実際の行は次のようになります。

Mod# 2 11494    Chi^2:  1.19608371367   Scale:  0.567691651772  Tin:    1499    Teff:   3400    Luminosity:     568.0   L   M-dot: 4.3497e-08   Tau: 2.44E-01   Dust composition: Fe    IRx1:   0.540471121182

IRx1 とそれに続く値に興味があります。

4

2 に答える 2

4

ファイルに 1 行に 1 つの数字があると仮定します。

threshold = 5
with open('path/to/file') as infile:
    numbers = [float(line.strip()) for line in infile]
numbers.sort(reverse=True)
bigger = list(itertools.takewhile(lambda n: n<threshold, numbers))

ファイルが次のようになっている場合:

1 5.2
2 1.43
3 3.54
4 887
5 0.35

出力を にしたい場合は、次のようにしますset([2,3,5])

with open('path/to/file') as infile:
    numbers = dict([float(i) for i in line.strip()] for line in infile)
lines = sorted(numbers, key=numbers.__getitem__, reverse=True)
answer = list(itertools.takewhile(lambda n: numbers[n]<threshold, lines))

次のようなファイルがあるとします。

Mod# 2 11494    Chi^2:  1.19608371367   Scale:  0.567691651772  Tin:    1499    Teff:   3400    Luminosity:     568.0   L   M-dot: 4.3497e-08   Tau: 2.44E-01   Dust composition: Fe    IRx1:   0.540471121182

とを\t区切るタブ ( ) がある場合、次のスクリプトが機能するはずです。11494Chi^2

def takeUntil(fpath, colname, threshold):
    lines = []
    with open(fpath) as infile:
        for line in infile:
            ldict = {}
            firsts = line.split('\t', 2)
            ldict[firsts[0] = float(firsts[1])
            splits = firsts[2].split('\t')
            ldict.update(dict(zip(firsts, itertools.islice(firsts, 1, len(firsts)))))
            lines.append(ldict)
    lines.sort(reverse=True, key=operator.itemgetter(colname))
    return [row['Mod#'] for row in itertools.takewhile(lambda row: row[colname]<threshold, lines)]

その機能を使用すると、どの列の値がしきい値を下回っていることを確認するかを指定できるはずです。このアルゴリズムはスペースの複雑さが高くなりますが (必要以上に RAM を使用します)、linesファイルを読み取った後にマーシャリング/ピクルを実行し、そこから後続の実行を続行できるはずです。これは、処理に時間がかかる巨大な入力ファイルがある場合に特に便利です (おそらくそうかもしれません)。

于 2013-07-10T03:22:14.147 に答える