首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在python中对齐两个列表

在python中对齐两个列表
EN

Stack Overflow用户
提问于 2014-07-24 04:29:24
回答 3查看 2.1K关注 0票数 1

我有两个列表,一个包含真值,另一个包含实验结果及其相关分数。

代码语言:javascript
复制
truth = [6, 8, 7, 10]
experiment = [(6, 5), (4, 3), (2, 4), (11, 6), (7, 4)]

我希望将我的实验和真值对齐,从而使最大真值对齐

代码语言:javascript
复制
        [6, 8, 7, 10]
        [6, missing, 7, missing]

现在,我想将未对齐的子序列中的缺失赋值给它们。

这里我们从(4, 3), (2, 4), (11, 6)中选择了11个,因为它有最高的分数。最后一个缺少的值被赋值为0,因为没有元素位于(7, 4)之外

代码语言:javascript
复制
truth = [6, 8, 7, 10]
exp  =  [6, 11, 7, 0]   # Zero because 7 is the last element of experiment subsequence.

我在difflib库中查找,但不太了解。我该怎么做呢?

EN

回答 3

Stack Overflow用户

发布于 2014-07-24 05:08:28

对于第一部分,您可以这样做:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2014-07-24 05:13:25

第一部分可以通过简单的列表理解来完成:

代码语言:javascript
复制
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函数:

代码语言:javascript
复制
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)
票数 0
EN

Stack Overflow用户

发布于 2014-07-24 05:48:53

假设您永远不会有两个或更多的缺失值相邻,您可以使用:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24920350

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档