0

4つのセット('myTup')とタプル('tupleToSearch')があります。このタプルのすべてのインスタンスを各4つに検索する必要があります。'tupleToSearch'は、各4つの要素の最初の2つの要素と比較され、一致した場合は、一致した4つの要素の最後の2つの要素が報告されます。

私は同じことをするために次のコードを使用しています。

myTup = set([('0994900', '50.2297', 'name1', '<4'),
             ('2176041', '24.2880', 'name2', 'POSITIVE'), 
             ('2240663', '51.2510', 'name3', '25.0'), 
             ('2240663', '51.2510', 'name4', '29.0'), 
             ('2240663', '51.2560', 'name4', '29.0')])

tupToSearch = ('2240663', '51.2510')


[(x[2],x[3]) for x in myTup if tupToSearch == (x[0],x[1])]

正確な検索ではなく、範囲の比較を実行するように、このコードを拡張する必要があります。

たとえば、が与えられた場合、tupleToSearch = ('2240663', '51.2510')2番目の要素が> = 51.2510であるが、(51.2510 +オフセット)よりも小さい4つ組を見つけたいと思います。ここで、「オフセット」は定数です。

上記の場合の正解は、最後の3つの4倍(これらのそれぞれの最後の2つの要素のみ)を報告します。

正しく比較するために2番目の要素を数値に変換する方法。

また、この手順をほぼ10億回繰り返す必要があるため、これを行うための効率的な方法が必要です。

4

2 に答える 2

0

さて、このコードを書くために使用できるfloat関数があります:

low_target = float(tupToSearch[1])
high_target = low_target + constant
[(x[2],x[3]) for x in myTup if low_target<=float(x[1])<=high_target]
于 2013-01-02T17:31:56.233 に答える
0

必要な要素を除外し、各要素のチャンクを引き出して結果を作成します。

[(el[2], float(el[3])) for el in itertools.ifilter(lambda oel: oel[0] == search_tup[0] and float(search_tup[1]) <= float(oel[1]) <= float(search_tup[1]) + offset, my_tup)]

または、ジェネレーターを使用して単一のパスですべてを実行します (ジェネレーターは、リスト comp とは異なり、el[3]float に変換できないケースを適切に処理することに注意してください)。

def filtered_data(input, search_target, offset):
    key = search_target[0]
    value = float(search_target[1])
    for entry in input:
        entry_value = float(entry[1])
        if entry[0] == key and entry_value <= value <= entry_value + offset:
            try:
                result_value = float(entry[3])
            except ValueError:
                result_value = entry[3]
            yield (entry[2], result_value)

[filtered_data(my_tup, search_tup, .019)]

ここでは浮動小数点値を使用しているため、浮動小数点 10 進数値を浮動小数点 2 進数値に変換するときに発生する不正確な不正確さが、フィルタリング プロセスに常に影響することに注意してください。その結果、Decimalベース値にもオフセットを使用または構築することが必要になる場合があります。

于 2013-01-02T17:00:55.033 に答える