Python:"内部联接"字典数组

时间:2017-07-03 15:04:38

标签: python arrays numpy

我目前正在使用此代码进行比较并制作一个新数组,当时键的值为' time' list1和list2都是一样的:

open

但是,如果两个列表都有例如每个超过6000个项目,则处理时间过长。有办法让它更快吗?

在这种情况下,我可以使用Numpy来提高速度吗?

修改

一个例子:

def innerJoin(self, list1, list2):

    mergedList = []
    for i in range(len(list1)):
        for j in range(len(list2)):
            if (list1[i]['time']==list2[j]['time']):
                mergedList.append(list2[j])

    return mergedList

它应该返回:

list1 =[{
      'time': '2017-07-03T01:12:13Z',
      'tag': 'TEMP',
      'value': 34.5
    },{
      'time': '2017-07-03T01:12:17Z',
      'tag': 'TEMP',
      'value': 34
    }]

list2 =[{
      'time': '2017-07-03T01:12:13Z',
      'tag': 'VOLUME',
      'value': 3
    }]

我不需要'标记'和'代码',所以如果这样的回报没问题:

mergedList =[{
          'time': '2017-07-03T01:12:13Z',
          'tag': 'VOLUME',
          'value': 3
        }]

2 个答案:

答案 0 :(得分:4)

你可以尝试这些方法:

def innerJoin(list1, list2):
    set1 = set(l['time'] for l in list1)
    return [l for l in list2 if l['time'] in set1]

或者您可以使用过滤器:

    ...
    return filter(lambda i: i['time'] in set1, list2)

答案 1 :(得分:2)

你可以用它。它的速度要快得多:

def innerJoin(list1, list2):
    mergedList = []
    # Of course you can skip the sorting if you know that they are sorted
    # but it is much faster even if you sort first
    l1 = sorted(list1, key=lambda s:s['time'])
    l2 = sorted(list2, key=lambda s:s['time'])

    i1=0
    i2=0

    while(i1 < len(l1) and i2 < len(l2)):

    if (l1[i1]['time']==l2[i2]['time']):
            mergedList.append(l2[i2])
            i1=i1+1
            i2=i2+1

    else:
            if (l1[i1]['time']<l2[i2]['time']):
        i1=i1+1
            else:
                i2=i2+1
    return mergedList

你的算法是O(n²),而我的算法是O(n)。排序可能是O(n * log n)。来自knipknap的解决方案通常更好用,但我认为这个答案可以很好地理解选择的算法如何影响性能。

我尝试了n = 3,000,000。当我不得不对列表进行排序时,需要10秒钟,如果我预先分配它需要3.2秒。

我想指出您的代码可能有错误,具体取决于您是否要将其视为错误。如果其中一个列表中有双联,您将在返回的列表中获得双联。我不知道你是否有这样的想法,但事实就是如此。我花了大约一小时才意识到我的代码没有错。 :)

如果您想使用我的代码并且想要该功能,则必须对其进行修改。