我需要找到任意两个元素之间列表的最大差异。在列表[1,2,3,4,5]
中,使用for循环的最大差异为4(在元素1和5之间)。
该程序需要输出这两个元素(0和4)的位置及其值(1和5)。
我只能弄清楚如何找到连续值之间的最大差异,但如果最大值从其他地方开始,则会产生问题,例如: [4,1,6,3,10,8]
其中最大差异在1到10之间(位置1和4)。有人能帮我吗?
答案 0 :(得分:6)
您可以使用内置函数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)
答案 1 :(得分:4)
在天真的方法中,您只需要两个嵌套循环,以确保每个元素访问每个其他列表元素。由于您只需要检查每对一次,因此每次都可以在 next 索引处启动内部循环:
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循环,所以我们仍然可以通过在线性时间内进行最小/最大发现来实现它的效率,只需迭代一次:
# 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
这基本上与mgilson的回答相同。我们自己完成内置函数max
和min
的工作,并手动找到最小值和最大值。
答案 2 :(得分:2)
您可以先排序列表,然后获取最小值和最大值。另外,使用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
答案 3 :(得分:1)
只需从最小值中减去最大值。这在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
答案 4 :(得分:1)
这可以使用max
和min
+ enumerate
完成:
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:
>>> lst = [1,2,3,4,5]
>>> biggest_idx, biggest_value = max(enumerate(lst), key=lambda x: x[1])
>>> smallest_idx, smallest_value = min(enumerate(lst), key=lambda x: x[1])
>>> print biggest_idx, biggest_value
4 5
>>> print smallest_idx, smallest_value
0 1
答案 5 :(得分:0)
min_i = 0
max_i = 0
for i in xrange(len(alist)):
if alist[i] < alist[min_i]:
min_i = i
if alist[i] > alist[max_i]:
max_i = i
print "min=%d, max=%d" % (alist[min_i], alist[max_i])
print "min index=%d, max index=%d", (min_i, max_i)
print "difference=%d" % (alist[min_i] - alist[max_i])
答案 6 :(得分:0)
它可以像......一样简单。
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))