1

正確なタイトルを付ける方法がわかりませんが、ここに問題があります。

問題:

いくつかの位置がすでに保存されているランキングリスト(いくつかのトップリストを想像してください)を提供したいと思います。

7 つのスロットが[1, 2, 3, 4, 5, 6, 7, 8]あり、一部は既に位置 1、3、4、7、9 を保持しているとします (スロットは 8 つしかないため、保持された位置 9 は最後のスロットを意味します)。

次に、2 つ、5 つ、6 つのスロットが残っているので、それらを他のオブジェクトで埋める必要があります。

簡単な質問:

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

>>> a = [1, 3, 4, 7, 9]
>>> b = [object_x, object_y, object_z]

そして、私はそれらをこれにマージしたい:

>>> c = [1, object_x, 3, 4, object_y, object_z, 7, 9]

(ここでは「object_x」を 0 として使用できます。)

それだけです。これを実装するエレガントな方法があるかどうかを確認したいだけです。

(コメントに基づいて質問全体を編集します。どうもありがとうございました。)

4

5 に答える 5

1

これはエッジケースをカバーしていると思いますが、これを行うためのより良い方法があるに違いないと他の人に同意します。あなたがやろうとしていることの文脈を説明する価値があるかもしれません。おそらく、これらすべてなしでそれを行う方法があります。

def merge(a, b):
    b = list(b)
    a = iter(a)
    current = 1
    for item in a:
        while item != current:
            if b:
                yield b.pop(0)
            else:
                yield item
                yield from a  # <3.3 use `for item in a: yield item` instead.
                return
            current += 1
        yield item
        current += 1

あなたの仕様に従って動作するように見えます:

>>> print(list(merge([1, 3, 4, 7, 9], [0, 0, 0])))
[1, 0, 3, 4, 0, 0, 7, 9]
>>> print(list(merge([2, 4, 5], [1, 3])))
[1, 2, 3, 4, 5]

また、余分な要素が与えられた場合に何が起こるかは不明ですb- これはそれらを無視しますが、最後にyield from b(または <3.3 for item in b: yield item) を追加すると、それらが最終的な要素として与えられます。

于 2013-04-10T03:50:27.413 に答える
0

Thanks all, and I get this solution inspired by @jurgenreza

>>> a = [1, 3, 4, 7, 9]
>>> b = [0, 0, 0]
>>> for i in a:
        b.insert(i - 1, i)

>>> print b
[1, 0, 3, 4, 0, 0, 7, 9]
于 2013-04-10T05:58:44.473 に答える
0

そもそもこのマージを行う必要は避けたほうがよいでしょう。可能なランクがいくつあるかを事前に知っている場合は、その数Noneの を含むリストから開始し、スペースを占有するたびに、追加ではなくリスト項目の割り当てを使用して設定することができます。その後、最終的なマージは次のように簡単です。

def merge(a, b):
   b = iter(b)
   for i,x in a: 
       if x is None:
          a[i] = next(b)

気が向いたら、このwhoeデータ構造をクラスに入れることができます。これにより、たとえば、占有されている位置を上書きしようとしているときにチェックすることもできます(それがエラーになる場合):

class Ranks:
    def __init__(self, size):
        self._list = [None] * size

    def __getitem__(self, position):
        return self._list[position]

    def __setitem__(self, position, val):
        if self._list[position] is None:
            raise ValueError('attempting to clobber existing rank data')
        self._list[position] = val
于 2013-04-10T08:48:14.093 に答える