我有一些来自txt文件的数据数据,我试图将其排序为一个如下所示的列表:
[ALASKA, [2006/10/19, 2.8], [2006/10/18, 2.6], etc etc]
[MEXICO, [2006/10/20, 2.8], [2006/10/18, 3.3]] for each location without any tuples or ''
2.8 2006/10/19 02:02:10 62.391 -149.751 15.0 CENTRAL ALASKA
2.5 2006/10/19 00:31:15 20.119 -156.213 1.5 MAUI REGION, HAWAII
5.0 2006/10/18 21:15:51 4.823 -82.592 37.3 SOUTH OF PANAMA
2.6 2006/10/18 21:12:25 59.934 -147.904 30.0 GULF OF ALASKA
3.4 2006/10/18 20:59:21 36.540 -89.640 7.7 SOUTHEASTERN MISSOURI
代码:
def main():
file = open('data.txt','r')
category1 = [[]]
for line in file:
magnitude, date, time, x, y, z, location = line.strip().split(' ')
locationend = location.split(' ')[-1]
category1[locationend].append((date,magnitude))
#print(category1)
main()
现在我遇到一个错误,其中line.split函数无法解压每行上的所有8个数据,还有另一种方法可以删除项目3:5吗?我知道它可能是列表中的pop函数。
答案 0 :(得分:0)
str.split
包含一个可选的maxsplit
参数,用于限制要拆分的值,您可以使用此参数将整个位置名称作为单个项目。现在,您可以使用dict
收集每个位置的数据列表。 collections.defaultdict
在这里很不错,因为它会自动为新键创建值。现在您有一个日期/幅度对列表,您可以在编写时使用itertools.chain
解压缩它们。把它们放在一起,你得到了
import collections
import itertools
def main():
locations = collections.defaultdict(list)
with open('data.txt','r') as file:
for line in file:
magnitude, date, time, x, y, z, location = line.strip().split(' ', 6)
locations[location].append((date, magnitude))
with open('output.txt', 'w') as outfile:
for location, data in locations.items():
outfile.write('{}, {}\n'.format(location,
' ,'.join(itertools.chain.from_iterable(data))))
main()
print(open('output.txt').read())
答案 1 :(得分:0)
此解决方案使用字典来保存每个区域设置的每个事件的列表:
这是因为我没有文件而使用的样本数据:
data = [x.strip() for x in """
2.8 2006/10/19 02:02:10 62.391 -149.751 15.0 CENTRAL ALASKA
2.5 2006/10/19 00:31:15 20.119 -156.213 1.5 MAUI REGION, HAWAII
5.0 2006/10/18 21:15:51 4.823 -82.592 37.3 SOUTH OF PANAMA
2.6 2006/10/18 21:12:25 59.934 -147.904 30.0 GULF OF ALASKA
3.4 2006/10/18 20:59:21 36.540 -89.640 7.7 SOUTHEASTERN MISSOURI
""".split('\n')[1:-1]]
此代码显示如何在保持整个位置的同时浏览数据并将其拆分。在发现整个位置之后,很容易获得该位置的最后一个单词,并保留该位置后缀的每个事件的列表。并非传递给6
的{{1}}强制它将所有内容保留在剩下的一个字段(位置)中的前五个字段之后:
split()
答案 2 :(得分:0)
这样的事情应该有效:
def process(filename):
d = {}
with open(filename, "r") as f:
for line in f:
line_contents = line.split()
if line_contents[-1] in d.keys(): # we already have an entry
d[line_contents[-1]].append([line_contents[1], line_contents[0]])
else:
d[line_contents[-1]] = [[line_contents[1], line_contents[0]]]
return d
如果愿意,您还可以将每个键的值设置为元组列表。