2

原子位置を説明する 2 つのデータ セットがあります。それらは、私が比較したい別々のファイルにあり、座標によって一致する原子を特定することを目的としています。どちらの場合もデータは次のようになり、最大で 1000 程度のエントリが存在します。ファイルは、異なるサイズのシステムを記述し、次の形式を持っているため、長さが異なります。

   1   ,    0.000000000000E+00  0.000000000000E+00    
   2   ,   0.000000000000E+00  2.468958660000E+00  
   3   ,    0.000000000000E+00 -2.468958660000E+00  
   4   ,   2.138180920454E+00 -1.234479330000E+00  
   5   ,    2.138180920454E+00  1.234479330000E+00

最初の列はエントリ ID で、2 番目の列は x、y の座標のセットです。

私がやりたいことは、両方のデータセットの座標を比較し、一致と対応する ID を特定することです。たとえば、「ファイル 1 のエントリ 3 はファイル 2 のエントリ 6 に対応します」などです。この情報を使用して、ファイル 2 内の座標値を変更します。

ファイルを1行ずつ読み取り、コマンドを使用して1行ごとに2つのエントリに分割し、リストに入れましたが、比較ビットを指定する方法について少し困惑しています-特に2番目を比較するように指示しますエントリのみ、最初のエントリを呼び出すことができます。ループが必要になると思いますか?

これまでのコードは次のようになります。

open1 = open('./3x3supercell_coord_clean','r')
openA = open('./6x6supercell_coord_clean','r')

small_list=[]

for line in open1:
    stripped_small_line = line.strip()
    column_small = stripped_small_line.split(",") 
    small_list.append(column_small)

big_list=[]

for line in openA:
    stripped_big_line = line.strip()
    column_big = stripped_big_line.split(",")
    big_list.append(column_big)

print small_list[2][1] #prints out coords only
4

4 に答える 4

0

辞書を使用するアプローチは次のとおりです。

coords = {}

with open('first.txt', 'r') as first_list:
    for i in first_list:
        pair = [j for j in i.split(' ') if j]
        coords[','.join(pair[2:4])] = pair[0]
        #reformattted coords used as key "2.138180920454E+00,-1.234479330000E+00"

with open('second.txt', 'r') as second_list:
    for i in second_list:
        pair = [j for j in i.split(' ') if j]
        if ','.join(pair[2:4]) in coords:
            #reformatted coords from second list checked for presence in keys of dictionary
            print coords[','.join(pair[2:4])], pair[0]

ここで何が起こっているかというと、ファイル A の各座標 (これは異なると述べています) がキーとして辞書に格納されます。次に、最初のファイルが閉じられ、2 番目のファイルが開かれます。2 番目のリストの座標が開かれ、辞書キーの保存方法と一致するように再フォーマットされ、メンバーシップがチェックされます。リスト B の座標文字列が Dictionarycoordsにある場合、ペアは両方のリストに存在します。次に、その一致に関して、1 番目と 2 番目のリストから ID を出力します。

辞書検索は O(1) より高速です。このアプローチには、チェックするためにメモリ内にすべてのデータを保持する必要がない (1 つのリストのみ) という利点もあり、型キャスト (float/int 変換など) について心配する必要もありません。

于 2013-05-21T15:55:54.047 に答える
0

次の方法で 2 つの辞書を作成します。

# do your splitting to populate two dictionaries of this format:
# mydata1[Coordinate] = ID

# i.e.
for line in data1.split():
    coord = line[2] + ' ' + line[3]
    id = line[0]
    mydata1[coord] = id
for line in data2.split():
    coord = line[2] + ' ' + line[3]
    id = line[0]
    mydata2[coord] = id


#then we can use set intersection to find all coordinates in both key sets
set1=set(mydata1.keys())
set2=set(mydata2.keys())
intersect = set1.intersection(set2)

for coordinate in intersect:
  print ' '.join(["Coordinate", str(coordinate), "found in set1 id", set1[coordinate]), "and set2 id", set2[coordinate])])
于 2013-05-21T15:32:40.397 に答える