2016-03-07 12 views
5

私は1つのリストを持っているPythonでリストを比較するには?

a = [1.0, 2.0, 2.1, 3.0, 3.1, 4.2, 5.1, 7.2, 9.2] 

aと同じ要素を持っている私は、他のリストと、このリストを比較したいが、また、私は、数値order.All他のリストで、リストの内容に関する情報を抽出したいです。

だから私は、私がa1の比較やdictの値[3, 5, 6, 8]を抽出したいこの

a = [1.0, 2.0, 2.1, 3.0, 3.1, 4.2, 5.1, 7.2, 9.2] 
b = [1, 2, 3, 4, 5, 6, 7, 8, 9] 
print dict(zip(a,b)) 

a1=[2.1, 3.1, 4.2, 7.2] 

を試してみました。

答えて

6
a1

だけループし、作成した辞書で一致するキーがあるかどうかを確認:

mapping = dict(zip(a, b)) 
matches = [mapping[value] for value in a1 if value in mapping] 

デモ:

>>> a = [1.0, 2.0, 2.1, 3.0, 3.1, 4.2, 5.1, 7.2, 9.2] 
>>> b = [1, 2, 3, 4, 5, 6, 7, 8, 9] 
>>> a1 = [2.1, 3.1, 4.2, 7.2] 
>>> mapping = dict(zip(a, b)) 
>>> [mapping[value] for value in a1 if value in mapping] 
[3, 5, 6, 8] 

をしかし、あなたは浮動小数点を使用しているアカウントに取ります数字。浮動小数点数は10進値のバイナリ近似であるため、値を正確に一致させることができない場合があります。例えば値2.999999999999999(15ナイン)は、3.0としてPython str()機能が提示したが、3.0から等しくないであることがあります。

>>> 2.999999999999999 
2.999999999999999 
>>> str(2.999999999999999) 
'3.0' 
>>> 2.999999999999999 == 3.0 
False 
>>> 2.999999999999999 in mapping 
False 

あなたの入力はaがソートされ、あなたがmath.isclose() functionを使用することができます表示される場合(またはそれのバックポート)、一緒にbisect moduleとの効率的なマッチング保つために:

import bisect 
try: 
    from math import isclose 
except ImportError: 
    def isclose(a, b, rel_tol=1e-09, abs_tol=0.0): 
     # simplified backport, doesn't handle NaN or infinity. 
     if a == b: return True 
     return abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol) 

result = [] 
for value in a1: 
    index = bisect.bisect(a, value) 
    if index and isclose(a[index - 1], value): 
     result.append(b[index - 1]) 
    elif index < len(a) and isclose(a[index], value): 
     result.append(b[index]) 

aからの入力値ごとに2つの値までこの試験。 (index - 1にある)と等しいかそれよりも低く、次に高い値になることが保証されているもの。あなたのサンプルaの場合、値2.999999999999999は、32.13.0の間にインデックスされます。 isclose(3.0, 2.999999999999999)が真であるため、それでも4にその値をマップすることができます。b

+0

Petersありがとうございます。リスト内の数字は、f11.5でフォーマットされたFORTRANコードの実行結果です。私は単純なバージョンで十分でしょう! –

+0

あなたが*文字列*を持っているならば、あなたは問題の周りをきちんとスカートします。 –

関連する問題