0

私は2つのリストを持っています

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番目のアイテムを取ることです。'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

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

これはかなり悪いです...しかし、これはあなたが探しているものだと思います...しかし、すべてのコメントに従って代わりに入力をきれいにしてください!

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 に答える