应用高级逻辑来修改列表

时间:2013-08-01 17:59:45

标签: python list

我有两个列表

copy_from = ['2.02,1.91', '1.9,2.06', '1.86,1.98']
copy_to = [('-0.25', '2.02,1.91'), ('-1.50', '1.9,2.06')]

最终结果应为:

fixed = [('-0.25', '2.02,1.91', '2.02,1.91'), ('-1.50', '1.9,2.06', '1.86,1.98')]

我想做的就是从每个元组中获取第二项(列表copy_to),例如。 '2.02,1.91'并在列表copy_from中查看其位置。在我们对其进行本地化后,我想从列表copy_from'1.9,2.06')中获取下一个项目,然后将其复制回列表copy_to中的批准元组。但是,copy_from有时会遗漏批准的 next 项。这是copy_to'元组项目是copy_from中的邻居。而在上面他们是。

如果是这种情况,我不能使用 next 项,我必须重复项目(如fixed第一元组中所示)。如果没有邻居,就像这样:

copy_from = ['2.02,1.91', '2, 1.89', '1.9,2.06', '1.86,1.98']
copy_to = [('-0.25', '2.02,1.91'), ('-1.50', '1.9,2.06')]

然后结果应该是:

fixed = [('-0.25', '2.02,1.91', '2, 1.89'), ('-1.50', '1.9,2.06', '1.86,1.98')]

将有两个 - 相邻和不相邻的项目。

我知道这个解释让人感到困惑,希望你能理解我的来源。我知道,这是一项复杂的任务,所以任何提示,比如在哪里看,哪个库可能也很有用!

4 个答案:

答案 0 :(得分:2)

你的问题很混乱,很困惑。但我认为无论你的实际问题是什么,你的第一步应该是创建一个dict。当你的问题是“我需要查找一个键并获得相应的值,或者如果它不存在时获得一些默认值”,答案通常是dict.get

例如,您可以创建dictcopy_from的每个成员映射到其后续成员:

copy_from = ['2.02,1.91', '1.9,2.06', '1.86,1.98']
dict_from = dict(zip(copy_from, copy_from[1:]))

现在,要获取copy_from中任何值的下一个值,或者键本身(如果不存在):

value = dict_from.get(value, value)

特别是:

>>> v = '1.9,2.06'
>>> dict_from.get(v, v)
'1.86,1.98'
>>> v = '1.86,1.98'
>>> dict_from.get(v, v)
'1.86,1.98'

认为至少在你想要的路上?

答案 1 :(得分:1)

这很糟糕......但我认为这可以满足您的需求......但是根据所有评论清理您的输入!

copy_from = ['2.02,1.91', '1.9,2.06', '1.86,1.98']
copy_to = [('-0.25', '2.02,1.91'), ('-1.50', '1.9,2.06')]

fixed = []
for ct in copy_to:
    if ct[1] in copy_from:
        idx = copy_from.index(ct[1])
        if idx < len(copy_from):
            ct += (copy_from[idx+1], )
        else:
            ct += (copy_from[idx], )
    fixed.append(ct)

答案 2 :(得分:1)

检查一下:

>>> result=[]
>>> copy_from_max_idx = len(copy_from) -1
>>> copy_to_max_idx = len(copy_to)-1
>>> for i,e in enumerate(copy_to):
    try:
        idx = copy_from.index(e[1])
    except:
        idx = -1
    if idx >=0:
        #check neighbours (next item actually)
        next_copy_from = e[1] if idx >= copy_from_max_idx else copy_from[idx + 1]
        next_copy_to = '' if i >= copy_to_max_idx else copy_to[i+1][1]
        if next_copy_to == next_copy_from:
            result.append(e + (e[1],))
        else:
            result.append(e + (next_copy_from,))

答案 3 :(得分:1)

首先到目的地列表是一个元组列表,一个元组是不可变的,所以我不得不做一个棘手的转换到列表列表。

这就是我提出的:

def doStuff(ref, dest):

    tmp = [list(x) for x in dest]
    search_keys  = [l[1] for l in tmp]

    ref_pairs  = [ref[n:n+2] for n in range(0, len(ref), 1) if len(ref[n:n+2]) > 1]
    dest_pairs = [search_keys[n:n+2] for n in range(0, len(search_keys), 1)]


    for index,pair in enumerate(dest_pairs):

        if pair in ref_pairs:
            tmp[index].append(pair[0])
        else:
            candidate_pair = [p for p in ref_pairs if p[0] == pair[0]]

            if candidate_pair:
                tmp[index].append(candidate_pair[0][1])
            else:
                tmp[index].append(None)

    return [tuple(l) for l in tmp]

# Test case 1
copy_from = ['2.02,1.91', '1.9,2.06', '1.86,1.98']
copy_to   = [('-0.25', '2.02,1.91'), ('-1.50', '1.9,2.06')]

copy_to = doStuff(copy_from, copy_to)
print 'Case1:\n', copy_to

# Test case 2
copy_from = ['2.02,1.91', '2, 1.89', '1.9,2.06', '1.86,1.98']
copy_to = [('-0.25', '2.02,1.91'), ('-1.50', '1.9,2.06')]

copy_to = doStuff(copy_from, copy_to)
print 'Case2:\n',  copy_to

# Test case 3
copy_from = ['2.02,1.91', '2, 1.89', '1.9,2.06']
copy_to = [('-0.25', '2.02,1.91'), ('-1.50', '1.9,2.06')]

copy_to = doStuff(copy_from, copy_to)
print 'Case3:\n',  copy_to

输出3个测试用例:

Case1:
[('-0.25', '2.02,1.91', '2.02,1.91'), ('-1.50', '1.9,2.06', '1.86,1.98')]
Case2:
[('-0.25', '2.02,1.91', '2, 1.89'), ('-1.50', '1.9,2.06', '1.86,1.98')]
Case3:
[('-0.25', '2.02,1.91', '2, 1.89'), ('-1.50', '1.9,2.06', None)]