1

次のように、それぞれ「時間」の列と「id」の列を含む2つのファイルを取得しました。

ファイル 1:

time     id
11.24    1
11.26    2
11.27    3
11.29    5
11.30    6

ファイル 2:

time     id
11.25    1
11.26    3
11.27    4
11.31    6
11.32    7
11.33    8

IDが一致する行の時間を互いに減算できるpythonスクリプトを実行しようとしています。ファイルの長さが異なります。

一致するIDを取得するために使用しようとしset(id's of file 1) & set(id's of file 2)ましたが、行き詰まりました。どんな助けでも大歓迎です、ありがとう。

4

4 に答える 4

3

リスト内包表記は、このトリックを非常に簡単に実行できます。

#read these from file if you want to, included in this form for brevity
F1 = {1: 11.24, 2: 11.26, 3:11.27, 5:11.29, 6:11.30}
F2 = {1:11.25, 3:11.26, 4:11.27, 6:11.31, 7:11.32, 8:11.33}

K1 = set(F1.keys())
K2 = set(F2.keys())

result = dict([ (k, F1[k] - F2[k]) for k in (K1 & K2)])
print result

これは出力されます:

{1: -0.009999999999999787, 3: 0.009999999999999787, 6: -0.009999999999999787}

編集: mhawke が指摘するように、最後の行は次のようになります。

result = {k: F1[k] - F2[k]) for k in (K1 & K2)}

私は口述内包表記のことをすっかり忘れていました。

于 2012-07-20T12:03:04.230 に答える
2

Python Set は、要素の順序付けをサポートしていません。データを辞書として保存します

file1 = {1:'11:24', 2:'11:26', ... etc}
file2 = {1:'11:25', 3:'11:26', ... etc}

減算 (時間ベースまたは数学ベース) を行うためのキー (または必要に応じて結合) の交差をループします。

于 2012-07-20T10:42:16.657 に答える
0

これは少し古い学校です。collectionsより洗練されたアプローチについては、モジュールのデフォルトの dict の使用を検討してください。

これは、任意の数のファイルに対して機能します。私は mine などと名付けましたf1f2一般的な考え方は、各ファイルを処理し、各 ID の時間値のリストを作成することです。reduceファイル処理の後、ディクショナリを反復処理して、(値リストを介して) 各値を減算します。

from operator import sub

d = {}
for fname in ('f1','f2'):
    for l in open(fname):
        t, i = l.split()
        d[i] = d.get(i, []) + [float(t)]

results = {}
for k,v in d.items():
    results[k] = reduce(sub, v)

print results
{'1': -0.009999999999999787, '3': 0.009999999999999787, '2': 11.26, '5': 11.29, '4': 11.27, '7': 11.32, '6': -0.009999999999999787, '8': 11.33}

更新しました

複数の値を持つ ID のみを含めたい場合:

results = {}
for k,v in d.items():
    if len(v) > 1:
        results[k] = reduce(sub, v)
于 2012-07-20T10:55:14.363 に答える
0

これをベースとして使用できます(「11.24」をフロートとして扱うのではなく、時間/分または分/秒に適応させたいと思います)... を使用して、一致するキーを効果的に結合および減算できますdefaultdict

データを次のような形式に変換できる限り:

f1 = [
    [11.24, 1],
    [11.26, 2],
    [11.27, 3],
    [11.29, 5],
    [11.30, 6]
]

f2 = [
    [11.25, 1],
    [11.26, 3],
    [11.27, 4],
    [11.31, 6],
    [11.32, 7],
    [11.33, 8]
]

それで:

from collections import defaultdict
from itertools import chain

dd = defaultdict(float)
for k, v in chain(
    ((b, a) for a, b in f1),
    ((b, -a) for a, b in f2)): # negate a

    dd[k] += v

結果:

{1: -0.009999999999999787,
 2: 11.26,
 3: 0.009999999999999787,
 4: -11.27,
 5: 11.29,
 6: -0.009999999999999787,
 7: -11.32,
 8: -11.33}

試合専用

matches = dict( (k, v) for v, k in f1 )
d2 = dict( (k, v) for v, k in f2 )

for k, v in matches.items():
    try:
        matches[k] = v - d2[k]
    except KeyError as e:
        del matches[k]

print matches
# {1: -0.009999999999999787, 3: 0.009999999999999787, 6: -0.009999999999999787}
于 2012-07-20T10:57:04.877 に答える