zaten yanıtlandı, ancak birkaç kişi sözlüğü tersine çevirmekten bahsettiğinden, bunu bir satırda (1: 1 haritalama varsayarak) ve bazı çeşitli mükemmel verileri nasıl yaptığınız aşağıda açıklanmıştır:
python 2.6:
reversedict = dict([(value, key) for key, value in mydict.iteritems()])
2.7+:
reversedict = {value:key for key, value in mydict.iteritems()}
1: 1 olmadığını düşünüyorsanız, yine de birkaç satırla makul bir ters harita oluşturabilirsiniz:
reversedict = defaultdict(list)
[reversedict[value].append(key) for key, value in mydict.iteritems()]
bu ne kadar yavaş: basit bir aramadan daha yavaş, ancak düşündüğünüz kadar yavaş değil - 'düz' 100000 giriş sözlüğünde, 'hızlı' arama (yani anahtarlarda erken olması gereken bir değer aramak) tüm sözlüğü tersine çevirmekten yaklaşık 10 kat daha hızlı ve 4-5 kat daha hızlı bir 'yavaş' arama (sonuna doğru). Bu yüzden en fazla 10 arama yaptıktan sonra kendisi için ödeme yapılır.
ikinci sürüm (öğe başına liste içeren), basit sürüm olduğu sürece yaklaşık 2,5 kat alır.
largedict = dict((x,x) for x in range(100000))
# Should be slow, has to search 90000 entries before it finds it
In [26]: %timeit largedict.keys()[largedict.values().index(90000)]
100 loops, best of 3: 4.81 ms per loop
# Should be fast, has to only search 9 entries to find it.
In [27]: %timeit largedict.keys()[largedict.values().index(9)]
100 loops, best of 3: 2.94 ms per loop
# How about using iterkeys() instead of keys()?
# These are faster, because you don't have to create the entire keys array.
# You DO have to create the entire values array - more on that later.
In [31]: %timeit islice(largedict.iterkeys(), largedict.values().index(90000))
100 loops, best of 3: 3.38 ms per loop
In [32]: %timeit islice(largedict.iterkeys(), largedict.values().index(9))
1000 loops, best of 3: 1.48 ms per loop
In [24]: %timeit reversedict = dict([(value, key) for key, value in largedict.iteritems()])
10 loops, best of 3: 22.9 ms per loop
In [23]: %%timeit
....: reversedict = defaultdict(list)
....: [reversedict[value].append(key) for key, value in largedict.iteritems()]
....:
10 loops, best of 3: 53.6 ms per loop
Ayrıca ifilter ile bazı ilginç sonuçlar elde etti. Teorik olarak, ifilter daha hızlı olmalıdır, çünkü itervalues () yöntemini kullanabiliriz ve muhtemelen tüm değerler listesini oluşturmak / bu listeden geçmek zorunda değiliz. Uygulamada, sonuçlar ... tuhaftı ...
In [72]: %%timeit
....: myf = ifilter(lambda x: x[1] == 90000, largedict.iteritems())
....: myf.next()[0]
....:
100 loops, best of 3: 15.1 ms per loop
In [73]: %%timeit
....: myf = ifilter(lambda x: x[1] == 9, largedict.iteritems())
....: myf.next()[0]
....:
100000 loops, best of 3: 2.36 us per loop
Bu nedenle, küçük ofsetler için önceki sürümlerden çok daha hızlıydı (önceki durumlar için minimum 1.48 * m * S'ye kıyasla 2.36 * u * S). Bununla birlikte, listenin sonuna yakın büyük ofsetler için, dramatik şekilde daha yavaştı (aynı 1,48 mS'ye karşı 15,1 ms). Düşük uçtaki küçük tasarruflar, yüksek uçtaki maliyete değmez, imho.