Python 3.x Python从两个长度相同的列表中获取唯一和最小的值对
我有两份清单:Python 3.x Python从两个长度相同的列表中获取唯一和最小的值对,python-3.x,pandas,list,numpy,Python 3.x,Pandas,List,Numpy,我有两份清单: index = [1,1,1,1,2,2,2,2,3,4,5,5,5,6,7,8,9,10,10,10] value = [2,3,2,1,2,4,6,8,2,1,5,2,7,2,2,2,1,55,1,11] 相同的长度,但我希望得到的回报是索引列表中唯一的数字和值列表中根据索引的最小值 结果应该是: index_result = [1,2,3,4,5,6,7,8,9,10] value_result = [1,2,2,1,2,2,2,2,1,1] 我试过: index =
index = [1,1,1,1,2,2,2,2,3,4,5,5,5,6,7,8,9,10,10,10]
value = [2,3,2,1,2,4,6,8,2,1,5,2,7,2,2,2,1,55,1,11]
相同的长度,但我希望得到的回报是索引列表中唯一的数字和值列表中根据索引的最小值
结果应该是:
index_result = [1,2,3,4,5,6,7,8,9,10]
value_result = [1,2,2,1,2,2,2,2,1,1]
我试过:
index = [1,1,1,1,2,2,2,2,3,4,5,5,5,6,7,8,9,10,10,10]
value = [2,3,2,1,2,4,6,8,2,1,5,2,7,2,2,2,1,55,1,11]
index_result = []
value_result = []
#global small_value
j = 0
while j < len(index):
if j == 0:
try:
if index[j] == index[j+1]:
small_value = min(value[j],value[j+1])
elif index[j] != index[j+1]:
index_result.append(index[j])
value_result.append(value[j])
except IndexError as e:
print(e)
pass
j = j + 1
print('small value is for index j ==0')
print(small_value)
elif j <len(index) - 1:
try:
# if index[j] == index[j-1]:
# small_value = min(value[j],value[j-1])
if index[j] != index[j+1] and index[j] != index[j-1]:
index_result.append(index[j])
value_result.append(value[j])
elif index[j] != index[j+1] and index[j] == index[j-1]:
index_result.append(index[j])
value_result.append(small_value)
except IndexError as e:
print(e)
pass
j = j + 1
print('small value is for index 0 < j <len(index)')
print(small_value)
elif j == len(index) - 1:
try:
if index[j] == index[j-1]:
small_value = min(value[j],value[j-1])
index_result.append((index[j]))
value_result.append(small_value)
elif index[j] != index[j-1]:
index_result.append(index[j])
value_result.append(value[j])
except IndexError as e:
print(e)
pass
j = j + 1
print('small value is for j = len(index) - 1')
print(small_value)
print (index_result)
print (value_result)
index=[1,1,1,2,2,2,3,4,5,5,6,7,8,9,10,10]
值=[2,3,2,1,2,4,6,8,2,1,5,2,7,2,2,2,1,1,55,1,11]
索引_结果=[]
值_结果=[]
#全局小值
j=0
而j
pd.DataFrame([index,value]).T.sort_values([0,1]).drop_duplicates(0)
0 1
3 1 1
4 2 2
8 3 2
9 4 1
11 5 2
13 6 2
14 7 2
15 8 2
16 9 1
18 10 1
我想这就是你想要实现的
import math
indices = [1,1,1,1,2,2,2,2,3,4,5,5,5,6,7,8,9,10,10,10]
values = [2,3,2,1,2,4,6,8,2,1,5,2,7,2,2,2,1,55,1,11]
result = [math.inf] * max(indices)
for i, v in zip(indices, values):
result[i-1] = min(result[i-1], v) # Apparently 1 based indexing
print(result)
[1, 2, 2, 1, 2, 2, 2, 2, 1, 1]
如果您的索引
像示例中那样是单调递增的,您可以使用itertools.groupby
from itertools import groupby
d = {k: min([x[1] for x in g]) for k, g in groupby(zip(index, value),
lambda x: x[0])}
In [95]: d
Out[95]: {1: 1, 2: 2, 3: 2, 4: 1, 5: 2, 6: 2, 7: 2, 8: 2, 9: 1, 10: 1}
index_result = list(d.keys())
Out[103]: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
value_result = list(d.values())
Out[105]: [1, 2, 2, 1, 2, 2, 2, 2, 1, 1]
Numpy解决方案:
index = np.array([1,1,1,1,2,2,2,2,3,4,5,5,5,6,7,8,9,10,10,10])
value = np.array([2,3,2,1,2,4,6,8,2,1,5,2,7,2,2,2,1,55,1,11])
[value[index == i].min() for i in np.unique(index)]
# [1, 2, 2, 1, 2, 2, 2, 2, 1, 1]
…和根据索引的值列表的最小值这是什么意思?pd.DataFrame({'value':value,'index':index})。groupby('index')。min()
?Yup有相同的答案@QuangHoang@JerryM. 对不起,我的英语意思是:1。索引列表应该只有唯一的,没有多余的数字2。值列表应返回与索引列表配对的值池中的最小值,例如:对于两个LIT:index[1,1,2]和[3,4,6],结果应为index[1,2]和[3,6]@QuangHoang我能拥抱你吗!?非常感谢您知道如何获取[1,2,3,4,5,6,7,8,9,10]索引列表吗?像一个独特的.function?@DaweiZhanglist(dict.from_iterable(index))