首页 > 解决方案 > 在对非重复变量求和时从列表中消除重复项

问题描述

我有一个包含三列、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()

标签: pythonnumpysortingtext

解决方案


您可以使用带有 (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)

推荐阅读