0

我有两个清单

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'并检查其在 list 中的位置copy_from。一旦我们对其进行了本地化,我想从 list copy_from( '1.9,2.06') 中取出下一项并将其复制回 list 中适当的元组copy_to。但是,copy_from有时会缺少适当的一项。这是当copy_to'元组项是 内的邻居时copy_from。在上面它们是。

在这种情况下,我不能拿下一个项目,我必须复制该项目(如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

4 回答 4

2

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

例如,您可以创建dict每个成员copy_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'

认为这至少在通往你想要的道路上?

于 2013-08-01T18:21:30.983 回答
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)]
于 2013-08-01T18:33:21.533 回答
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,))
于 2013-08-01T18:30:17.173 回答
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)
于 2013-08-01T18:20:26.403 回答