Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 查找两个列表之间的最大差异_Python_Algorithm_Data Structures_Ordereddictionary - Fatal编程技术网

Python 查找两个列表之间的最大差异

Python 查找两个列表之间的最大差异,python,algorithm,data-structures,ordereddictionary,Python,Algorithm,Data Structures,Ordereddictionary,我有两个列表old和new,元素数量相同 我正在尝试编写一个有效的函数,该函数将n作为参数,比较相同位置的两个列表的元素(按索引),查找n最大差异,并返回这些n元素的索引 我想最好用一个值排序字典来解决这个问题,但是用Python编写的字典(我不知道有哪个库提供它)。也许有更好的解决办法 从你的问题来看,我认为这就是你想要的: 差分 l1 = [15,2,123,4,50] l2 = [9,8,7,6,5] l3 = zip(l1, l2) def f(n): diff_val =

我有两个列表
old
new
,元素数量相同

我正在尝试编写一个有效的函数,该函数将
n
作为参数,比较相同位置的两个列表的元素(按索引),查找
n
最大差异,并返回这些
n
元素的索引


我想最好用一个值排序字典来解决这个问题,但是用Python编写的字典(我不知道有哪个库提供它)。也许有更好的解决办法

从你的问题来看,我认为这就是你想要的:

差分

l1 = [15,2,123,4,50]
l2 = [9,8,7,6,5]


l3 = zip(l1, l2)

def f(n):
    diff_val = 0
    index_val = 0
    l4 = l3[:n]

    for x,y in l4:
        if diff_val < abs(x-y):
            diff_val = abs(x-y)
            elem = (x, y)
            index_val = l3.index(elem)

    print "largest diff: ", diff_val
    print "index of values:", index_val


n = input("Enter value of n:") 

f(n)
<>如果这不是你想要的,当你想“想”的时候,考虑一下这个问题。p> 这将在O(n log x)时间内找到x个最大的项目,其中n是列表中的项目总数;排序在O(n log n)时间内完成

我突然想到,上面的内容实际上并没有满足你的要求。你想要一个索引!还是很容易。如果您需要差值的绝对值,我还将在此处使用
abs

>>> heapq.nlargest(10, xrange(len(l1)), key=lambda i: abs(l1[i] - l2[i]))
[91, 3, 14, 27, 46, 67, 59, 39, 65, 36]

假设列表中的元素数量不多,您可以将所有元素进行区分、排序,然后选择第一个
n

print sorted((abs(x-y) for x,y in zip(old, new)), reverse=True)[:n]
这将是
O(k log k)
其中
k
是原始列表的长度

如果
n
明显小于
k
,最好使用
heapq
模块提供的功能:

import heapq
print heapq.nlargest(n, (abs(x-y) for x,y in zip(old, new))
这将是
O(k log n)
而不是
O(k log k)
,这对
k>>n
可能很重要。 此外,如果您的列表非常大,您可能最好使用
itertools.izip
而不是常规的
zip
函数

>>> l = []
... for i in itertools.starmap(lambda x, y: abs(x-y), itertools.izip([1,2,3],   [100,102,330])):
...     l.append(i)
>>> l
5: [99, 100, 327]
itertools
对于重复性任务非常方便。从
starmap
元组转换为
*args
。因为
使用max
功能,您将能够获得所需的结果<代码>索引
功能将帮助查找位置

l.索引(最大(l)


这里有一个在中被黑客破解的解决方案(免责声明,我是numpy的新手,因此可能有更巧妙的方法来实现)。我没有组合任何步骤,因此很清楚每个步骤都在做什么。最终的值是原始列表的索引列表,按最高增量的顺序排列。选择前n只是
sorted\u inds[:n]
从每个列表或增量列表中检索值非常简单

我不知道它在性能上与其他解决方案相比如何,而且它显然不会出现在如此小的数据集上,但它可能值得使用您的真实数据集进行测试,因为我的理解是numpy对于数值阵列操作非常快

代码 输出
import heapq
print heapq.nlargest(n, (abs(x-y) for x,y in zip(old, new))
>>> l = []
... for i in itertools.starmap(lambda x, y: abs(x-y), itertools.izip([1,2,3],   [100,102,330])):
...     l.append(i)
>>> l
5: [99, 100, 327]
>>> l.index(max(l))
6: 2
import numpy

list1 = numpy.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
list2 = numpy.array([9, 8, 7, 6, 5, 4, 3, 2, 1])

#Caculate the delta between the two lists
delta = numpy.abs(numpy.subtract(list1, list2))
print('Delta: '.ljust(20) + str(delta))

#Get a list of the indexes of the sorted order delta
sorted_ind = numpy.argsort(delta)
print('Sorted indexes: '.ljust(20) + str(sorted_ind))

#reverse sort
sorted_ind = sorted_ind[::-1]
print('Reverse sort: '.ljust(20) + str(sorted_ind))
Delta:              [8 6 4 2 0 2 4 6 8]
Sorted indexes:     [4 3 5 2 6 1 7 0 8]
Reverse sort:       [8 0 7 1 6 2 5 3 4]