1

私は2つのリストを持ってref_listおりdata_list、それぞれに最初の要素が秒単位の時間のようなタプルを含み、2番目の要素が次のようなランダムな値です:

ref_list = [(1,value_ref_1),(3,value_ref_3),(4,value_ref_4), ... ]
data_list = [(1,value_dat_1),(2,value_dat_2),(4,value_dat_4), ... ]

2 番目の値の差を時間の関数として計算したい (タプルの最初の値)。つまり、最初の値が時間で、2 番目の値が 2 番目の値の差になるタプルのリストです。そして、前回使用した2つのリストのいずれかで欠落データを管理できるようにしたい! 前の例では、結果は次のようになります。

res_list = [(1,value_dat_1-value_ref_1),(2,value_dat_2-value_ref_1),(3,value_dat_2-value_ref_3),(4,value_dat_4-value_ref_4), ... ]

この例では、最初に as を持つタプルが にないため、タプルはタプルと(2,value_dat_2-value_ref_1)で作成されました。逆に同じ考え(2,value_dat_2)(1,value_ref_1)2ref_list(3,value_dat_2-value_ref_3)

リスト内包表記でそれを行う方法がわかりません。

私が十分に明確だったことを願っています。

どうもありがとう。

4

2 に答える 2

1

編集 1 : IndexError : 両方のリストの長さが同じであれば、インデックス エラーは発生しません。data_list[i] は、その内容に関係なく、data_list の i 番目の要素を提供します。また、python list() から値をポップすると、インデックスが「移動」されるため、インデックスのギャップがありません (他の言語とは異なります)。それとも、あなたの懸念をよく理解していなかったのかもしれません。

欠落データ: はい、はい。したがって、欠落している場合に備えて複数の値を返す必要があります: 上限と下限

[(elt[0],data_list[i][1]-elt[1]) if data_list[i][0]==elt[0] else ((elt[0],data_list[i][1]-ref_list[i-1][1]),(elt[0],data_list[i][1]-ref_list[i+1][1])) for i,elt in enumerate(ref_list)]

このようにして、値が欠落している場合、前の値と次の値を検索するため、欠落している値の範囲を知ることができます。別の構造の「else」タプルを返す以外に選択肢はありません。「各ターンで 1 つの「値」しか返せないためです。(または SyntaxError に直面する: 'for' で無効な構文)

これらのタプルのタプルが (値が欠落していることを検出するために) 必要な場合でも、別の解決策、つまり明示的なジェネレーターを知りたい場合があります。

def generator_stuff(data_list,ref_list):
    for i,elt in enumerate(ref_list):
        if data_list[i][0]==elt[0]:
            yield (elt[0],data_list[i][1]-elt[1])
        else:
            yield (elt[0],data_list[i][1]-ref_list[i-1][1])
            yield (elt[0],data_list[i][1]-ref_list[i+1][1])

これのパフォーマンスについてはまったくわかりませんが、各タプルを個別に返すため、タプルのタプルはありません。

于 2013-08-29T08:15:45.100 に答える
1

それぞれ 500k の値を持つ 2 つのリスト、100mb/200mb (生成パラメーターによる) の安定したメモリ使用量で、以下を追加で実行しました

list_a = [(1,222),(2,444),(5,666),(10,888)]
list_b = [(1,111),(3,333),(7,555),(9,777),(10,888)]

list_c = []

i = 1
a = None
b = None


def get_new(a, for_time):
    if len(a) == 0:
        raise IndexError

    # in the future
    if a[0][0] > for_time:
        return None

    return a.pop(0)

list_a_exhausted = False
list_b_exhausted = False

while True:     
    try:
        a = get_new(list_a,i) or a
    except IndexError:
        list_a_exhausted = True

    try:
        b = get_new(list_b,i) or b  
    except IndexError:
        list_b_exhausted = True

    if list_a_exhausted and list_b_exhausted:
        break

    list_c.append([(i,b[1]-a[1])])  
    i = i + 1
于 2013-08-29T09:24:06.123 に答える