0

私はリストAを持っています:

['0.0720', '0.0200', '0.0260', '0.0210', '0.0740', '0.0510', '0.0160']

また、リストB:

[
[0.074, 0.073, 0.072, 0.03, 0.029, 0.024, 0.021, 0.02], 
[0.02, 0.015], [0.026, 0.02, 0.015], 
[0.021, 0.02, 0.017], 
[0.077, 0.076, 0.074, 0.055, 0.045, 0.021], 
[0.053, 0.052, 0.051, 0.023, 0.022], 
[0.016]
]

Aの最初の要素をBの最初のサブリストと比較し、Aの最初の要素をBの2番目のサブリストと比較し、Aの3番目の要素をBの3番目のサブリストと比較する最も効率的な方法は何ですか。 B、...、および対応する要素が一致し、サブリストに2つ以上の要素が含まれている場合は、Bのサブリストから対応する要素を削除しますか?

4

1 に答える 1

1

を使用zip()すると、2つのリストの要素を組み合わせることができます。

for a, b in zip(A, B):
    # a is an element from A, b is a sublist from B.

サブリストには浮動小数点値が含まれ、リストAには文字列が含まれます。比較のための許容範囲を把握する必要があります。おそらく、フロートを一致する精度の文字列に変えるだけで十分でしょうか?

for a, b in zip(A, B):
    # a is an element from A, b is a sublist from B.
    b[:] = [i for i in b if format(i, '.4f') != a]

スライス代入()を使用して、サブリストの内容を、小数点以下4桁で一致しないすべての要素にb[:]置き換えます。a

サンプル入力でそれを実行すると、次のようになります。

[
[0.074, 0.073, 0.03, 0.029, 0.024, 0.021, 0.02], 
[0.015], 
[0.02, 0.015], 
[0.02, 0.017], 
[0.077, 0.076, 0.055, 0.045, 0.021], 
[0.053, 0.052, 0.023, 0.022], 
[]
]

最初の一致のみを削除する場合は、次を使用します。

try:
    del b[next(i for i, e in enumerate(b) if format(e, '.4f') == a)]
except StopIteration:
    pass

これにより、一致する最初のインデックスが検索され、それがから削除されbます。結果(この場合は以前とまったく同じ):

[[0.074, 0.073, 0.03, 0.029, 0.024, 0.021, 0.02],
 [0.015],
 [0.02, 0.015],
 [0.02, 0.017],
 [0.077, 0.076, 0.055, 0.045, 0.021],
 [0.053, 0.052, 0.023, 0.022],
 []]
于 2012-12-16T12:40:03.513 に答える