查找两个列表之间具有最大差异的元素索引
Find elements' indices with maximum difference between two lists
有两个列表
l1 = [1, 2.3, 1.4, 1.1]
l2 = [2.1, 0.9, 1.1, 3.2]
并且我想在列表中找到列表之间差异最大的元素。
即:
l1 = [1, 2.3, 1.4, 1.1] 应该 return 0 对于最小数字的索引 0
l2 = [2.1, 0.9, 1.1, 3.2] 应该 return 3 对于最大数
的索引 3
试试这个:
l1 = [1, 2.3, 1.4, 1.1]
l2 = [2.1, 0.9, 1.1, 3.2]
def max_diff(l1, l2):
min_l1 = min(l1)
max_l1 = max(l1)
min_l2 = min(l2)
max_l2 = max(l2)
max_diff1 = max_l2 - min_l1
max_diff2 = max_l1 - min_l2
if max_diff1 > max_diff2:
return l1.index(min_l1), l2.index(max_l2), max_diff1
else:
return l1.index(max_l1), l2.index(min_l2), max_diff2
l1_index, l2_index, max_diff = max_diff(l1, l2)
print(l1_index, l2_index, max_diff) # 0 3 2.2
请注意,这会计算最大差异,并且可以 return (min(l1), max(l2)) 或 (max(l1), min(l2)),具体取决于列表。
这里有一个更简洁的方法:
l1 = [1, 2.3, 1.4, 1.1]
l2 = [2.1, 0.9, 1.1, 3.2]
for k, v in {min: ['lo', l1], max: ['hi', l2]}.items():
print(f'{v[0]}={k(range(len(v[1])), key=v[1].__getitem__)}')
输出:
lo=0
hi=3
如果有多个结果:
l1 = [1, 2.3, 3.2, 1]
l2 = [1, 1, 1.1, 3.2]
def find_all(list1, list2):
def return_all(func, lst):
return [pos for pos, val in enumerate(lst) if val == func(lst)]
return [return_all(max, list1), return_all(min, list2)]
def output(res, order):
print(f"max position list {order[0]}: {res[order[0] - 1]}")
print(f"min position list {order[1]}: {res[order[1] - 1]}")
if max(l1) - min(l2) > max(l2) - min(l1):
results = find_all(l1, l2)
output(results, (1, 2))
elif max(l1) - min(l2) < max(l2) - min(l1):
results = find_all(l2, l1)
output(results[::-1], (2, 1))
else:
results = find_all(l1, l2)
output(results, (1, 2))
print ('And:')
results = find_all(l2, l1)
output(results[::-1], (2, 1))
输出:
max position list 1: [2]
min position list 2: [0, 1]
And:
max position list 2: [3]
min position list 1: [0, 3]
有两个列表
l1 = [1, 2.3, 1.4, 1.1]
l2 = [2.1, 0.9, 1.1, 3.2]
并且我想在列表中找到列表之间差异最大的元素。
即:
l1 = [1, 2.3, 1.4, 1.1] 应该 return 0 对于最小数字的索引 0
l2 = [2.1, 0.9, 1.1, 3.2] 应该 return 3 对于最大数
的索引 3试试这个:
l1 = [1, 2.3, 1.4, 1.1]
l2 = [2.1, 0.9, 1.1, 3.2]
def max_diff(l1, l2):
min_l1 = min(l1)
max_l1 = max(l1)
min_l2 = min(l2)
max_l2 = max(l2)
max_diff1 = max_l2 - min_l1
max_diff2 = max_l1 - min_l2
if max_diff1 > max_diff2:
return l1.index(min_l1), l2.index(max_l2), max_diff1
else:
return l1.index(max_l1), l2.index(min_l2), max_diff2
l1_index, l2_index, max_diff = max_diff(l1, l2)
print(l1_index, l2_index, max_diff) # 0 3 2.2
请注意,这会计算最大差异,并且可以 return (min(l1), max(l2)) 或 (max(l1), min(l2)),具体取决于列表。
这里有一个更简洁的方法:
l1 = [1, 2.3, 1.4, 1.1]
l2 = [2.1, 0.9, 1.1, 3.2]
for k, v in {min: ['lo', l1], max: ['hi', l2]}.items():
print(f'{v[0]}={k(range(len(v[1])), key=v[1].__getitem__)}')
输出:
lo=0
hi=3
如果有多个结果:
l1 = [1, 2.3, 3.2, 1]
l2 = [1, 1, 1.1, 3.2]
def find_all(list1, list2):
def return_all(func, lst):
return [pos for pos, val in enumerate(lst) if val == func(lst)]
return [return_all(max, list1), return_all(min, list2)]
def output(res, order):
print(f"max position list {order[0]}: {res[order[0] - 1]}")
print(f"min position list {order[1]}: {res[order[1] - 1]}")
if max(l1) - min(l2) > max(l2) - min(l1):
results = find_all(l1, l2)
output(results, (1, 2))
elif max(l1) - min(l2) < max(l2) - min(l1):
results = find_all(l2, l1)
output(results[::-1], (2, 1))
else:
results = find_all(l1, l2)
output(results, (1, 2))
print ('And:')
results = find_all(l2, l1)
output(results[::-1], (2, 1))
输出:
max position list 1: [2]
min position list 2: [0, 1]
And:
max position list 2: [3]
min position list 1: [0, 3]