我从两个单独的导入文件中获取了两组数据,这两个导入文件都被导入到python中,并且当前已被放置在列表中,如下所示。
列表1的格式为:
(参考编号,x坐标,y坐标)
示例列表1:[[1,0,0],[2,0,10],[3,0,20],[4,0,30],[5,0,40]]
列表2的格式为:
(x坐标,y坐标,温度)
示例列表2:[[0,0,100],[0,10,110],[0,20,120],[0,30,130],[0,40,140]]
我需要使用x和y坐标比较两个列表,如果找到匹配,则会生成一个包含相应参考编号和温度的新列表。
例如,从输出列表上方的两个列表开始,将遵循以下形式:
(参考编号,温度)
示例输出列表:[[1,100],[2,11],[3,120],[4,130],[5,140]]
这是用大量数据完成的,我真的很难找到解决方案,任何帮助都会非常感激。干杯
答案 0 :(得分:3)
lst1 = [[1, 0, 0], [2, 0, 10], [3, 0, 20], [4, 0, 30], [5, 0, 40]]
lst2 = [[0, 0, 100], [0, 10, 110], [0, 20, 120], [0, 30, 130], [0, 40, 140]]
dict1 = {(x, y): ref for ref, x, y in lst1}
dict2 = {(x, y): temp for x, y, temp in lst2}
matchxy = set(dict1) & set(dict2)
lstout = sorted([dict1[xy], dict2[xy]] for xy in matchxy)
print(lstout)
这提供了
所需的输出[[1, 100], [2, 110], [3, 120], [4, 130], [5, 140]]
我使用套装来找到共同点。
答案 1 :(得分:2)
这适用于0(n^2)
,但它很容易阅读和理解。
result = []
for reference, x, y in list1:
for a, b, temperature in list2:
if x == a and y == b:
result.append([temperature, reference])
您可以通过迭代0(n)
中的列表并存储坐标,将复杂度降低到dict
,如下所示:
dict1 = {}
for reference, x, y in list1:
dict[(x, y)] = reference
dict2 = {}
for x, y, temperature in list2:
dict2[(x, y)] = temperature
result = []
for coordinate, reference in dict1.iteritems():
temperature = dict2.get(coordinate)
if temperature:
result.append([temperature, reference])
答案 2 :(得分:1)
您可以使用map-reduce执行此任务。
伪代码:
map1(list): #runs on first file
for each (i,x,y) in list:
emit ((x,y),(1,i))
map2(list): #runs on 2nd file
for each (x,y,temp) in list:
emit ((x,y),(2,temp))
reduce((x,y),list): #runs on output of both mappers
for each (aux, val) in list:
if aux == 1:
i = val
else:
temp = val
if both i and temp initialized:
emit(i,temp)
Map-Reduce是一个框架,如果您将它们建模为一系列map-reduce任务,您可以轻松实现大数据问题,上面的伪代码解释了可能的map-reduce步骤。
这种方法可以轻松处理海量数据(包括peta尺度),并让框架为您完成肮脏的工作。
首先想法是将每个文件映射到某种哈希表(这是由框架内部完成的),并且你有两个哈希表:
一旦你有两个哈希表,就很容易找到哪个id连接到一个传递中的哪个温度,并且一旦建立连接就输出它。
此代码的复杂性为O(n)
平均大小写。
请注意,如果您的坐标不是整数(但使用浮点) - 您将需要使用一些基于树的地图而不是哈希表,并且在比较键时要非常小心 - 由于浮动的性质点算术。
在处理整数时,这不应成为问题。
答案 3 :(得分:0)
您可以构造sqlite
数据库表并查询它们以获得所需的结果。
import sqlite3, operator
reference = [[1, 0, 0], [2, 0, 10], [3, 0, 20], [4, 0, 30], [5, 0, 40]]
temperature = [[0, 0, 100], [0, 10, 110], [0, 20, 120], [0, 30, 130], [0, 40, 140]]
一些帮助者 - 我喜欢使用它们,因为它使后续代码可读。
reference_coord = operator.itemgetter(1,2)
ref = operator.itemgetter(0)
temperature_coord = operator.itemgetter(0,1)
temp = operator.itemgetter(2)
创建数据库(在内存中)
con = sqlite3.connect(":memory:")
两种方法可以解决这个问题,保留单独表格中的所有信息,或者只创建一个只包含所需数据的表格
每个列表一个表
con.execute("create table reference(coordinate TEXT PRIMARY KEY, reference INTEGER)")
con.execute("create table temperature(coordinate TEXT PRIMARY KEY, temperature INTEGER)")
# fill the tables
parameters = [(str(reference_coord(item)), ref(item)) for item in reference]
con.executemany("INSERT INTO reference(coordinate, reference) VALUES (?, ?)", parameters)
parameters = [(str(temperature_coord(item)), temp(item)) for item in temperature]
con.executemany("INSERT INTO temperature(coordinate, temperature) VALUES (?, ?)", parameters )
在两个表中查询您需要的数据
cursor = con.execute('SELECT reference.reference, temperature.temperature FROM reference, temperature WHERE reference.coordinate = temperature.coordinate')
print(cursor.fetchall())
组合两个列表中的数据的表
con.execute("create table data(coordinate TEXT PRIMARY KEY, reference INTEGER, temperature INTEGER)")
使用您关心的数据构建表
parameters = [(str(reference_coord(item)), ref(item)) for item in reference]
con.executemany("INSERT INTO data(coordinate, reference) VALUES (?, ?)", parameters)
parameters = [(temp(item), str(temperature_coord(item))) for item in temperature]
con.executemany("UPDATE data SET temperature=? WHERE coordinate=?", parameters)
简单查询,因为该表只有您想要的内容
cursor2 = con.execute('SELECT reference, temperature FROM data')
print(cursor2.fetchall())
con.close()
结果:
>>>
[(1, 100), (2, 110), (3, 120), (4, 130), (5, 140)]
[(1, 100), (2, 110), (3, 120), (4, 130), (5, 140)]
>>>
将数据导入数据库后,从中提取数据非常容易,如果在内存中使用文件db而不是db,则可以保留数据库。
如果可以接受外部库,pandas具有类似的功能,并且是一个非常棒的包。