Python:I';I’我试图找出列表中两个元素之间的最大差异

Python:I';I’我试图找出列表中两个元素之间的最大差异,python,Python,我需要找出列表中任意两个元素之间的最大差异。在列表[1,2,3,4,5]中,使用for循环的最大差值为4(元素1和元素5之间) 该程序需要输出这两个元素(0和4)的位置及其值(1和5) 我只能找出如何找到连续值之间的最大差异,但如果最大差异从其他地方开始,例如,[4,1,6,3,10,8]其中最大差异在1和10之间(位置1和4),则会产生问题。有人能帮我吗 只需从最小值中减去最大值即可。在Python中,这是微不足道的。一个很酷的方法是使用itemgetter。如果枚举列表中的项目,但对列表的原

我需要找出列表中任意两个元素之间的最大差异。在列表
[1,2,3,4,5]
中,使用for循环的最大差值为4(元素1和元素5之间)

该程序需要输出这两个元素(0和4)的位置及其值(1和5)


我只能找出如何找到连续值之间的最大差异,但如果最大差异从其他地方开始,例如,
[4,1,6,3,10,8]
其中最大差异在1和10之间(位置1和4),则会产生问题。有人能帮我吗

只需从最小值中减去最大值即可。在Python中,这是微不足道的。一个很酷的方法是使用
itemgetter
。如果枚举列表中的项目,但对列表的原始值执行最小/最大,则可以同时找到最小/最大索引和值。像这样:

>>> import operator
>>> values = [1, 2, 3, 4, 5]
>>>
>>> min_index, min_value = min(enumerate(values), key=operator.itemgetter(1))
>>> min_index, min_value
0, 1
>>> max_index, max_value = max(enumerate(values), key=operator.itemgetter(1))
4, 5
>>> difference = max_value - min_value
>>> difference
4

这可以通过使用
max
min
+
枚举来实现:

biggest_idx, biggest_value = max(enumerate(lst), key=lambda x: x[1])
smallest_idx, smallest_value = min(enumerate(lst), key=lambda x: x[1])
e、 g:

您可以先对列表进行排序,然后获取最小值和最大值。另外,使用
index()
获取元素的位置:

L = [1, 2, 3, 4, 5]

temp = sorted(L) # sorted list

min = temp[0]
max = temp[-1] # index -1 will give the last element
测试:

print "min", min, L.index(min)
print "max", max, L.index(max)
print "difference", max - min
min 1 0
max 5 4
difference 4
输出:

print "min", min, L.index(min)
print "max", max, L.index(max)
print "difference", max - min
min 1 0
max 5 4
difference 4

在Naiver方法中,您只需在中有两个嵌套循环,以确保每个元素访问其他每个列表元素。由于只需检查每一对,因此每次在下一个索引处启动内部循环就足够了:

lst = [1, 2, 3, 4, 5]

max_i, max_j = None, None # stores the indexes
max_d = -1 # stores the maximum distance we have seen so far

# iterate through all indexes of the list
for i in range(len(lst)):
    # iterate through all indexes, but starting from the index `i+1`
    for j in range(i + 1, len(lst)):
        d = abs(lst[i] - lst[j])
        if d > max_d:
            # memorize everything if the distance is larger than what we know
            max_i, max_j, max_d = i, j, abs(d)

print(max_i, max_j, max_d) # 0 4 4
对于两个嵌套循环,这当然不是真正有效的,但是当您确实需要比较每个列表元素时,这基本上是一个解决方案。在寻找最大距离的情况下,正如其他人指出的,您只需要查看最大和最小的列表项,这两个列表项都可以在线性时间内确定


正如您在上面的评论中所说,似乎只允许您使用for循环,因此我们仍然可以通过在线性时间内进行min/max查找,只迭代一次,从而使其高效:

# set the current maximum and minimum to the first index
max_i, min_i = 0, 0

# iterate the list from the second index
for i in range(1, len(lst)):
    # check if we’re larger than the current maximum
    if lst[i] > lst[max_i]:
        max_i = i

    # check if we’re smaller than the current minimum
    if lst[i] < lst[min_i]:
        min_i = i

distance = lst[max_i] - lst[min_i]
print(min_i, max_i, distance) # 0 0 4
#将当前最大值和最小值设置为第一个索引
最大值i,最小值i=0,0
#从第二个索引迭代列表
对于范围(1,len(lst))中的i:
#检查我们是否大于当前最大值
如果lst[i]>lst[max_i]:
max_i=i
#检查我们是否小于当前的最小值
如果lst[i]

这与mgilson的答案基本相同。我们只需要自己完成内置函数
max
min
的工作,然后手动查找最小值和最大值。

您可以使用内置函数
max
min
分别查找最大值和最小值,然后使用列表方法
index
在列表中查找它们的索引

numlist = [1, 2, 3, 4, 5]

max_val = max(numlist)
min_val = min(numlist)

max_pos = numlist.index(max_val)
min_pos = numlist.index(min_val)
min_i=0
max_i=0
对于x范围内的i(len(alist)):
如果alist[i]alist[max_i]:
max_i=i
打印“最小=%d,最大=%d”%(列表[min\u i],列表[max\u i])
打印“最小索引=%d,最大索引=%d”(最小索引i,最大索引i)
打印“差异=%d”%(列表[min\u i]-列表[max\u i])

它可以简单到

numlist=[4,1,6,3,10,8]
print('min value index : ' , numlist.index(min(numlist)))
print('max value index : ' , numlist.index(max(numlist)))
print('Max Difference : ',max(numlist)-min(numlist))

调用sorted会将这个问题从一个O(n),常量内存问题更改为一个O(n logn),O(n logn)内存问题。它的效率非常低。@arshajii-min、max和将这些值映射到索引的值都是O(n)。@arshajii-我发布了一个O(n)解决方案,Alex Thornton也发布了一个O(n)解决方案。@davidermann这是一个由5个小数字组成的列表,语言是Python。我看不出这里的效率有多重要p虽然时间复杂度的O(n lg n)界是正确的,但空间复杂度在最坏的情况下是O(n),对于许多算法来说是O(1)。对不起,我忘了提到我必须使用其中一个来完成循环,想想列表中两个元素之间的最大距离。对于列表中的其他部分,他们还有什么“特殊”之处吗?请不要在评论中添加澄清;编辑原始问题。这非常有帮助!非常感谢。第2行和第3行中应该是“numlist”而不是“maxlist”。第4行和第5行中也应该是“list”,而不仅仅是“list”。另外,你的答案正好适合这个问题,应该被接受为答案。