从列表中消除重复项,同时对非重复变量求和

时间:2019-06-06 12:07:50

标签: python numpy sorting text

我有一个包含RA,DEC和TIME三列的望远镜的文本文件。 RA和DEC是天空坐标,而TIME是在该坐标处的观测时间。虽然在许多条目中重复了RA和DEC,但每个条目中的时间却没有,即可以先指向(RA,DEC)=(120,30)的前2小时,然后再指向4,最后再指向1。想法是使用python编写另一个文本文件,其中每对坐标仅出现一次,时间是该坐标中所有时间的总和。当然,有些坐标只能观察一次,因此不会重复。

我做了一些尝试,此刻我设法编写了相同的输入文件,但是每个坐标的第一个输入始终是好的结果。问题是,如果重复一对坐标(例如5次),则文本文件将写入该坐标5次,这是第一个坐标中的时间之和,而我不知道的其余时间,但是它们不应该在那里

import numpy as np

file_all=open('input_file.txt',"r")
data_all   = np.loadtxt(input_file,unpack=True)
time_all = data_all[0]
ra_all   = data_all[1]
dec_all  = data_all[2]

file_new=open('output_file.txt',"w")
file_new.write('#Time   RA           Dec\n')

time_new = np.zeros(len(ra_all))
ra_new = np.zeros(len(ra_all))
dec_new = np.zeros(len(ra_all))

for i in range(len(ra_all)):
    time_new[i]=time_all[i]
    for k in range(len(ra_all)):
        if ((ra_all[i]==ra_all[k]) and i!=k):
            cont = 0
            if i<=k:
                time_new[i]=time_new[i]+time_all[k]
                ra_new[i] = ra_all[i]
                dec_new[i] = dec_all[i]
        elif ((ra_all[i]!=ra_all[k]) and i!=k):
            time_new[i]=time_all[i]
            ra_new[i] = ra_all[i]
            dec_new[i] = dec_all[i]
    if ra_new[i]!=0:
        t = '%.3f   %.5f    %.5f\n' % (time_new[i], ra_new[i], dec_new[i])
        file_new.write(t)
file_new.close()

1 个答案:

答案 0 :(得分:0)

您可以使用以(RA,DEC)元组为键的字典来实现此目的。

my_dict = dict()
for i in range(len(data_all)):
    key = (ra_all[i], dec_all[i])
    # get() would return the value of the key if it exists, and 0 otherwise
    value = my_dict.get(key, 0)
    value += time_all[i]
    my_dict[key] = value

for (ra, dec), time in my_dict.items():
    t = '%.3f   %.5f    %.5f\n' % (time, ra, dec)
    file_new.write(t)