2

タブ区切りのファイルが 2 つあります。ファイル内の行数が同じではありません。各ファイルの最初の 2 列を辞書に入れました。両方のファイルの同一の (キー、値) ペアを別の出力ファイルに取得したいと考えています。

例えば

dict1 = {'sim3_orf00006': 'gi|224475510|ref|YP_002633116.1|', 'sim3_orf00005': 'gi|224475511|ref|YP_002633117.1|'}
dict2 = {'gi|224475987|ref|YP_002633593.1|': 'sim2_orf00909', 'gi|224477510|ref|YP_002635116.1|': 'sim1_orf00452'}

ファイル1:

sim2_orf01946    gi|224475611|ref|YP_002633217.1|    100.0

ファイル 2:

gi|224475496|ref|YP_002633102.1|     sim3_orf00019   100.0

更新:返信していただきありがとうございます

4

5 に答える 5

5

(key, value)セットとペアの交点を使う:

with open('output_file', 'w') as f:
    for key, value in set(dict1.items()) & set(dict2.items()):
        f.write("%s\t%s" % (key, value))
于 2012-10-16T13:38:27.217 に答える
1

メモリ内に一時セットを作成する必要はありません。ディクショナリはすでにO(1)ルックアップの複雑さを提供しています:

dict1 = {'a':'b', 'c':'d'}
dict2 = {'c':'d', 'e':'f'}

filtered = ((item,value) for (item,value) in dict1.iteritems() if item in dict2 and value==dict2[item])
with open('output_file', 'w') as f:
    for key, value in filtered:
        text = '{}\t{}'.format(key, value)
        print(text)
        f.write(text)

value==dict2[item]がシャツ回路演算子であるため、がitem in dict2返された場合にのみ計算されます。Trueand

nまた、最初のディクショナリのm長さと 2 番目のディクショナリの長さに対するこのソリューションの複雑さは、2 番目のディクショナリでのルックアップnによる反復であることに注意することが重要です。したがって、が より小さい場合、辞書を交換する価値があるため、複雑さは になります。O(1)O(n)mnO(m)

セットの交差には複雑さがあるため、使用setしても効果はありません。s&tO(min(len(s), len(t))

したがって、このアプローチでは、メモリのフットプリントが減少し、複雑さは同じままになります。

于 2012-10-16T13:55:19.900 に答える
1

あなたが使用することができます:

for key, d1v in dict1.iteritems():
    try:
        if d1v == dict2[key]:
            pass # it's a match
    except KeyError as e:
        pass # no corresponding key

または、重複が少ないと予想される場合は、比較するキーを事前に計算します。

for key in (dict1.viewkeys() & dict2.viewkeys()): # use .keys() in 3.x
    if dict1[key] == dict2[key]:
         pass # match
于 2012-10-16T14:09:54.383 に答える
0

これにより、両方のファイルに存在するキーと値のペアのみが 3 番目のファイルに書き込まれますdict。ただし、元のファイルの行全体が必要な場合は、別の方法で処理する必要があります。dict可能な方法の 1 つは、検索を高速化するために、これらの行を直接に追加することです。

outfile = open('path/to/output/file', 'w')
for k,v in dict1.iteritems():
    if k in dict2 and dict2[k]==v:
        outfile.write('\t'.join([k,v]) + '\n')
outfile.close()

お役に立てれば

于 2012-10-16T13:38:09.030 に答える
0
A = {}
B = {}

# put stuff in them

for key in A.keys():
    if key in B.keys() and A[key] == B[key]:
        #write to file

また

shared_keys = [key for key in A.keys() if key in B.keys() and A[key] == B[key]]
with open("path/to/file", 'w') as writer:
    for key in shared_keys:
        writer.write("Key: %s, A: %s, B: %s" % (key, A[key], B[key]))
于 2012-10-16T13:38:21.093 に答える