在Python中对齐两个列表
我有两个列表,一个是表示真值的,另一个是包含实验结果及其相关分数的。
truth = [6, 8, 7, 10]
experiment = [(6, 5), (4, 3), (2, 4), (11, 6), (7, 4)]
我想把我的实验结果和真值对齐,确保对齐的真值最大。
[6, 8, 7, 10]
[6, missing, 7, missing]
现在我想给那些没有对齐的子序列中的缺失值分配一个值。
在这里,我们从(4, 3), (2, 4), (11, 6)
中选择了11,因为它的分数最高。最后一个缺失的值被赋值为0
,因为在(7, 4)
之后没有其他元素。
truth = [6, 8, 7, 10]
exp = [6, 11, 7, 0] # Zero because 7 is the last element of experiment subsequence.
我在查找difflib
库,但没太明白。
我该怎么做呢?
3 个回答
0
假设你永远不会有两个或更多缺失值挨在一起,你可以使用:
truth = [6, 8, 7, 10]
experiment = [(6, 5), (4, 3), (2, 4), (11, 6), (7, 4)]
exp_list = [x[0] for x in experiment] #[6, 4, 2, 11, 7]
# Part one.
exp = [t if t in exp_list else None for t in truth] #[6, None, 7, None]
# Part two.
for i, t in enumerate(exp):
if t == None:
# Get index of previous and next truth values for missing values.
i_prev = exp_list.index(exp[i-1]) if i else 0
i_next = exp_list.index(exp[i+1]) if i < len(exp)-1 else len(exp_list)
# Pick the largest value between them or 0 if no values are there.
values_between = exp_list[slice(i_prev + 1, i_next)]
exp[i] = max(values_between) if values_between else 0
print exp #[6, 11, 7, 0]
0
对于第一部分,你可以这样做:
truth = [6, 8, 7, 10]
experiment = [(6, 5), (4, 3), (2, 4), (11, 6), (7, 4)]
def prepare(exp):
keys = [i for i, j in exp]
def select(v):
return v if v in keys else None
return select
select = prepare(experiment)
exp = [select(i) for i in truth]
# exp will be [6, None, 7, None]
0
第一部分可以通过一个简单的列表推导式来完成:
truth = [6, 8, 7, 10]
experiment = [(6, 5), (4, 3), (2, 4), (11, 6), (7, 4)]
res1 = [x if x in dict(experiment) else None for x in truth]
...或者如果你更喜欢用lambda函数的话:
truth = [6, 8, 7, 10]
experiment = [(6, 5), (4, 3), (2, 4), (11, 6), (7, 4)]
res1 = map(lambda x: x if x in dict(experiment) else None, truth)