python - 在对非重复变量求和时从列表中消除重复项
问题描述
我有一个包含三列、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()
解决方案
您可以使用带有 (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)
推荐阅读
- python - 从python中的数组中排除值
- xaml - UWP - 无法分配给模板化控件上的属性“Windows.UI.Xaml.Controls.Primitives.Selector.SelectedIndex”错误
- excel - 将 vba 函数的结果放在另一个 excel 单元格中
- python - 全局比对序列
- android - 如何在 Android Studio 中强制升级 Flutter SDK?
- c# - 在将数据绑定到 gridview 时更改日期格式
- ruby-on-rails - 样式未在 SLIM for Rails 视图中用作变量
- javascript - VUE CLI 3 项目上的字符集 UTF-8 编码错误
- ffmpeg - 如何从具有平铺或马赛克效果ffmpeg的视频中获取20张截图?
- java - 无效或损坏的 jarfile myjavafile.jar Ubuntu 18.04