比较python中的两个坐标列表并使用坐标值来指定值

时间:2015-02-08 10:49:01

标签: python algorithm list

我从两个单独的导入文件中获取了两组数据,这两个导入文件都被导入到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]]

这是用大量数据完成的,我真的很难找到解决方案,任何帮助都会非常感激。干杯

4 个答案:

答案 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尺度),并让框架为您完成肮脏的工作。


首先想法是将每个文件映射到某种哈希表(这是由框架内部完成的),并且你有两个哈希表:

  1. key =(x,y)value = id
  2. key =(x,y)value = temprature
  3. 一旦你有两个哈希表,就很容易找到哪个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具有类似的功能,并且是一个非常棒的包。