-6

次のような大きなリストがあります。

['a', 'b', 'c', 'd', 'e', 'f', 'g', ...]

辞書を使用してインデックスを追跡したいと思います。辞書は次のようになります。

{1:'a', 2:'b', 3:'c', 4:'d', 5:'e', 6:'f', 7:'g', ...}

しかし、新しい要素を挿入する必要があります。そして、挿入時に挿入ポイントの後のリスト要素のインデックスが自動的に1増加するようにします。これを行うための迅速または従来の方法はありますか?私は通常 python を使用しますが、他の形式のアルゴリズムでも問題ありません。

更新: 理由もなく質問に投票しないでください。(簡単にするために)一部のコンテキストは省略されていますが、質問自体はかなり明確です。なぜこれを行う必要があるのか​​ を知らなくても、答えを提供できると思います。

4

3 に答える 3

6

インデックスを値にマッピングするdictがあるのはなぜですか? それはリストがすでに行っていることです:

>>> x = ['a', 'b', 'c', 'd', 'e', 'f', 'g', ...]
>>> x[0]
'a'
>>> x[4]
'e'

新しい値を挿入するなどしてリストを変更すると、インデックスは自動的に修正されます。

dict とリスト自体の唯一の違いは、リストのインデックスが 0 であり、dict のインデックスが 1 であることです (「a」は 1 です)。

于 2012-06-26T03:32:16.647 に答える
0

インデックスを使用して他のリストへのマッピングを追跡することを指定します。そして、これは大きなデータセットであるため、おそらくルックアップ速度が重要です(ここでは辞書が大きな利点を持っています)。

インデックスがデータの絶対に不可欠な部分ではなく、リレーションを参照するための便利な方法にすぎない場合、なぜ物事を別々のリストに保存するのでしょうか。関連するすべてのデータが一緒に保持されるように、ネストされた辞書を検討しましたか?例えば、

dataset = { 'a': { 'name':'Alice' , 'food':'pie' } , 'b': { 'name':'Bob' , 'food':'cake' , 'friend':'Eve' } }

>>> dataset['a']['food']
'pie'

これはより読みやすく、辞書は、大きなリストと比較して、特定の任意のデータのルックアップをはるかに高速に提供します。しかし、目標を知らずにカスタマイズされたソリューションを推奨することは困難です。たとえば、すべてのデータをキーで参照できるかどうか(常に「a」を探している)、または特定の値を時々見つけたいかどうか(パイが好きな人)を知るのに役立ちます。

于 2012-06-26T05:07:50.553 に答える
0

これは、整数の再番号付けと 1 から始まるインデックス付けをカプセル化するクラスです。このクラスのインスタンスが辞書のインターフェイスをエミュレートする方法については、それ自体が辞書ではない場合でも、最後の例を参照してください。

# define DEFAULT value that is very unlikely to be a list value
DEFAULT=object()

class IndexedList(object):
    def __init__(self, seq=None):
        self._seq = list(seq) if seq is not None else []
    def __contains__(self, key):
        if isinstance(key, int):
            return 1 <= key <= len(self._seq)
        else:
            return key in self._seq
    def __getitem__(self, index):
        return self._seq[index-1]
    def __setitem__(self, index, value):
        self._seq[index-1] = value
    def __str__(self):
        return str(self._seq)
        # or if you'd rather have it look like a dict
        # return "{%s}" % ', '.join("%d: '%s'" % (i,s) for i,s in self.iteritems())
    def iterkeys(self):
        i = 1
        while i <= len(self._seq):
            yield i
            i += 1
    def keys(self):
        return list(self.iterkeys())
    def itervalues(self):
        return iter(self._seq)
    def values(self):
        return list(self.itervalues())
    def iteritems(self):
        return enumerate(self._seq, start=1)
    def items(self):
        return list(self.iteritems())
    def insert(self, i, value):
        self._seq.insert(i-1, value)
    def pop(self, i, default=DEFAULT):
        if i in self:
            return self._seq.pop(i-1)
        else:
            if default is not DEFAULT:
                return default
            else:
                raise KeyError("%s not a valid key" % i)
    # everything else, just delegate to owned list object
    def __getattr__(self, attr):
        return getattr(self._seq, attr)


# make an instance of IndexedList; print items just like it was a dict
il = IndexedList("abcdefg")
print il
print il.items()
# Prints
# ['a', 'b', 'c', 'd', 'e', 'f', 'g']
# [(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd'), (5, 'e'), (6, 'f'), (7, 'g')]
#   or if you choose to show dict-ish output
# {1: 'a', 2: 'b', 3: 'c', 4: 'd', 5: 'e', 6: 'f', 7: 'g'}
# [(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd'), (5, 'e'), (6, 'f'), (7, 'g')]


# insert an item into the middle of the sequence, note that
# remaining items get incremented keys
il.insert(4,'x')
print il
print il.items()
# Prints
# ['a', 'b', 'c', 'x', 'd', 'e', 'f', 'g']
# [(1, 'a'), (2, 'b'), (3, 'c'), (4, 'x'), (5, 'd'), (6, 'e'), (7, 'f'), (8, 'g')]


# test dict.pop
print il.pop(3)
print il
print il.items()
# Prints
# c
# ['a', 'b', 'x', 'd', 'e', 'f', 'g']
# [(1, 'a'), (2, 'b'), (3, 'x'), (4, 'd'), (5, 'e'), (6, 'f'), (7, 'g')]


# test 'key in dict' behavior
print 0 in il
print 3 in il
print 100 in il
print il.keys()
print il.values()
# Prints
# False
# True
# False
# [1, 2, 3, 4, 5, 6, 7]
# ['a', 'b', 'x', 'd', 'e', 'f', 'g']


# so you can treat il directly as a dict, but if you really really need a dict
# object, make one using il.iteritems
ildict = dict(il.iteritems())
print ildict
# Prints
# {1: 'a', 2: 'b', 3: 'x', 4: 'd', 5: 'e', 6: 'f', 7: 'g'}
于 2012-06-26T05:17:10.313 に答える