it-swarm.com.de

Python - Liefert den ersten N-Schlüssel: Wertepaare aus Dict

Betrachten Sie das folgende Wörterbuch, d:

d = {'a': 3, 'b': 2, 'c': 3, 'd': 4, 'e': 5}

Ich möchte die ersten N-Schlüssel-Wert-Paare von d zurückgeben (N <= 4 in diesem Fall). Was ist die effizienteste Methode, dies zu tun?

56
Jason Strimpel

Es gibt keine solchen "ersten n" -Tasten, da sich eine dict nicht daran erinnert, welche Schlüssel zuerst eingefügt wurden.

Sie können jedoch any n Schlüssel-Wert-Paare erhalten:

n_items = take(n, d.iteritems())

Dies verwendet die Implementierung von take aus den itertools-Rezepten :

from itertools import islice

def take(n, iterable):
    "Return first n items of the iterable as a list"
    return list(islice(iterable, n))

Sehen Sie es online arbeiten: ideone

70
Mark Byers

Ein sehr effizienter Weg, etwas abzurufen, ist das Kombinieren von Listen- oder Wörterbuchverständnissen mit dem Schneiden. Wenn Sie die Artikel nicht bestellen müssen (Sie möchten nur n zufällige Paare), können Sie ein Wörterbuchverständnis wie folgt verwenden:

# Python 2
first2pairs = {k: mydict[k] for k in mydict.keys()[:2]}
# Python 3
first2pairs = {k: mydict[k] for k in list(mydict)[:2]}

Im Allgemeinen ist ein solches Verständnis immer schneller als die entsprechende "for x in y" -Schleife. Indem Sie .keys () verwenden, um eine Liste der Wörterbuchschlüssel zu erstellen und diese Liste in mehrere Teile zu unterteilen, vermeiden Sie es, beim Erstellen des neuen Wörterbuchs unnötige Tasten zu berühren. 

Wenn Sie die Schlüssel nicht benötigen (nur die Werte), können Sie ein Listenverständnis verwenden:

first2vals = [v for v in mydict.values()[:2]]

Wenn Sie die Werte anhand ihrer Schlüssel sortieren müssen, ist dies kein Problem mehr:

first2vals = [mydict[k] for k in sorted(mydict.keys())[:2]]

oder wenn Sie auch die Schlüssel brauchen:

first2pairs = {k: mydict[k] for k in sorted(mydict.keys())[:2]}
48
monotasker

Die dicts von Python sind nicht geordnet, daher ist es sinnlos, nach den "ersten N" -Tasten zu fragen.

Die collections.OrderedDict -Klasse ist verfügbar, wenn Sie das brauchen. Sie könnten effizient die ersten vier Elemente als

import itertools
import collections

d = collections.OrderedDict((('foo', 'bar'), (1, 'a'), (2, 'b'), (3, 'c'), (4, 'd')))
x = itertools.islice(d.items(), 0, 4)

for key, value in x:
    print key, value

Mit itertools.islice können Sie aus jedem Iterator träge Elemente entnehmen. Wenn das Ergebnis wiederverwendbar sein soll, müssen Sie es in eine Liste oder etwas konvertieren, z.

x = list(itertools.islice(d.items(), 0, 4))
9
Jeremy Banks
foo = {'a':1, 'b':2, 'c':3, 'd':4, 'e':5, 'f':6}
iterator = iter(foo.items())
for i in range(3):
    print(next(iterator))

Verwandeln Sie die Ansicht (dict_items) grundsätzlich in einen Iterator und wiederholen Sie sie mit next ().

5
cop4587

Ich habe es hier nicht gesehen. Wird nicht bestellt, aber am einfachsten syntaktisch, wenn Sie nur einige Elemente aus einem Wörterbuch nehmen müssen.

n = 2
{key:value for key,value in d.items()[0:n]}
3
user2623954

Siehe PEP 0265 zum Sortieren von Wörterbüchern. Verwenden Sie dann den oben genannten iterierbaren Code.

Wenn Sie mehr Effizienz in den sortierten Schlüssel-Wert-Paaren benötigen. Verwenden Sie eine andere Datenstruktur. Das heißt, eine Sortierung, die die sortierte Reihenfolge und die Schlüsselwertzuordnungen aufrechterhält.

Z.B.

import bisect

kvlist = [('a', 1), ('b', 2), ('c', 3), ('e', 5)]
bisect.insort_left(kvlist, ('d', 4))

print kvlist # [('a', 1), ('b', 2), ('c', 3), ('d', 4), ('e', 5)]
3
silverjam

Dies hängt davon ab, was in Ihrem Fall "am effizientesten" ist.

Wenn Sie nur eine zufällige Stichprobe eines großen Wörterbuchs foo suchen, verwenden Sie foo.iteritems() und nehmen Sie so viele Werte wie nötig ab. Dies ist eine Lazy-Operation, die die Erstellung einer expliziten Liste von Schlüsseln oder Elementen vermeidet. 

Wenn Sie Schlüssel zuerst sortieren müssen, gibt es keine Möglichkeit, etwas wie keys = foo.keys(); keys.sort() oder sorted(foo.iterkeys()) zu verwenden. Sie müssen eine explizite Liste von Schlüsseln erstellen. Dann durchschneiden oder iterieren Sie zuerst N keys.

Übrigens, warum interessiert Sie der "effiziente" Weg? Hast du dein Programm profiliert? Wenn Sie dies nicht getan haben, verwenden Sie zuerst den offensichtlichen und leicht verständlichen Weg. Die Chancen stehen gut, ohne Engpässe zu werden.

1
9000

Wählen Sie für Python 3 und höher die ersten n Paare aus

n=4
firstNpairs = {k: Diction[k] for k in list(Diction.keys())[:n]}
0
Shivpe_R

ein Dikt betrachten 

d = {'a': 3, 'b': 2, 'c': 3, 'd': 4, 'e': 5}

from itertools import islice
n = 3
list(islice(d.items(),n))

islice wird es schaffen :) hoffe es hilft!

0
Vivek Ananthan

füge einfach eine Antwort mit Zip hinzu,

{k: d[k] for k, _ in Zip(d, range(n))}
0
Peter Li

Sie können dies auf verschiedene Arten erreichen. Wenn die Reihenfolge wichtig ist, können Sie Folgendes tun:

for key in sorted(d.keys()):
  item = d.pop(key)

Wenn die Reihenfolge kein Problem ist, können Sie Folgendes tun:

for i in range(4):
  item = d.popitem()
0
g.d.d.c

Das Wörterbuch behält keine Reihenfolge bei. Bevor Sie also die N-Schlüsselpaare auswählen, können Sie es sortieren.

import operator
d = {'a': 3, 'b': 2, 'c': 3, 'd': 4}
d=dict(sorted(d.items(),key=operator.itemgetter(1),reverse=True))
#itemgetter(0)=sort by keys, itemgetter(1)=sort by values

Jetzt können wir Top 'N' Elemente abrufen: Verwenden Sie die Methodenstruktur wie folgt:

def return_top(elements,dictionary_element):
    '''Takes the dictionary and the 'N' elements needed in return
    '''
    topers={}
    for h,i in enumerate(dictionary_element):
        if h<elements:
            topers.update({i:dictionary_element[i]})
    return topers

um die obersten 2 Elemente zu erhalten, verwenden Sie einfach diese Struktur:

d = {'a': 3, 'b': 2, 'c': 3, 'd': 4}
d=dict(sorted(d.items(),key=operator.itemgetter(1),reverse=True))
d=return_top(2,d)
print(d)
0

Dies mag nicht sehr elegant sein, funktioniert aber für mich:

d = {'a': 3, 'b': 2, 'c': 3, 'd': 4, 'e': 5}

x= 0
for key, val in d.items():
    if x == 2:
        break
    else:
        x += 1
        # Do something with the first two key-value pairs
0