2016-09-19 1 views
0

Ich brauche ein Wörterbuch zu erstellen, in dem ich einen Wert zuweisen kann, die das gleiche Objekt in der Liste klassifiziert. Beachten Sie, dass ich keinen bereits vorhandenen Wert habe, ich möchte Python einen zuweisen. Hier ist, was ich habe:Wie erstelle ich ein Verzeichnis, um ähnlichen Elementen in einer Liste Werte zuzuweisen.

In [38]: post_title_list 
Out[38]: [u'the rfe master list', 
      u'the rfe master list', 
      u'the rfe master list', 
      ...] 

die rfe Master-Liste geht für etwa 700 mal mehr auf, bis wir den nächsten Titel beginnen, die u'the co Problem‘ist. Ich möchte für jede neue Phrase in der Liste eine Nummer vergeben, so dass die RFE-Master-Liste 1 zugewiesen wird, bis wir zu dem Co-Problem kommen, dem 2 zugewiesen werden würde und so weiter.

Ich habe die folgenden Codes ohne Glück versucht:

In [39]: d = dict(zip(post_title_list, range(len(post_title_list))) 
    Out[39]: {u'the rfe master list': '491818'} 

    In [40]: {item: str(i) for i, item in enumerate(post_title_list)} 
    Out[40]: {u'the rfe master list': '491818'} 

    In [41]: dict.fromkeys(post_title_list) 
    Out[41]: {u'the rfe master list': None} 

gewünschte Ausgabe:

Out[42]: {u'the rfe master list': 1, 
      u'the rfe master list': 1, 
      u'the rfe master list': 1, 
      u'the co problem'  : 2, 
      u'the co problem'  : 2, 
      u'expecting delays' : 3, 
      u'denied help   : 4, 
      ...} 

Danke.

+0

können Sie nicht die gleichen mehrere Schlüssel haben. Sie können nur eine "the rfe master list" haben, nicht mehrere, wenn Sie eine andere hinzufügen, wird sie die alte ersetzen. –

+0

Schlüssel können in einem Python 'dict' nicht ähnlich sein, während Sie für verschiedene Schlüssel ähnliche Werte haben können. –

+0

Jeder Schlüssel in einem Wörterbuch muss eindeutig sein, daher ist das Ziel doppelter Einträge nicht möglich. Sie könnten stattdessen eine Liste von Wert-/Zahlenpaaren wie [('Hauptliste', 1)] erstellen, wenn Sie wirklich Duplikate benötigen. –

Antwort

1

Wie in den Kommentaren angegeben, müssen Wörterbücher eindeutige Schlüssel haben. Also würde ich eine Liste von Tupeln vorschlagen. Um eine ähnliche Form der gewünschten Ausgabe zu erzeugen, schlage ich so etwas wie:

ctr = 1 

l = [ 
    'a', 
    'a', 
    'a', 
    'a', 
    'a', 
    'a', 
    'a', 
    'a', 
    'b', 
    'b', 
    'b', 
    'b', 
    'b', 
    'b', 
    'c', 
    'c', 
    'c', 
    'c', 
    'c', 
] 

out = [] 
for idx, element in enumerate(l): 
    if idx == 0: 
     out.append((element, ctr)) 
    else: 
     if element != l[idx-1]: 
      ctr = ctr + 1 
     out.append((element, ctr)) 

print(out) 

[('a', 1), 
('a', 1), 
('a', 1), 
('a', 1), 
('a', 1), 
('a', 1), 
('a', 1), 
('a', 1), 
('b', 2), 
('b', 2), 
('b', 2), 
('b', 2), 
('b', 2), 
('b', 2), 
('c', 3), 
('c', 3), 
('c', 3), 
('c', 3), 
('c', 3)] 

-Update aufgrund Kommentar

Die Art und Weise Listen gedruckt geben werden, hängt auf welche Entwicklungsumgebung Sie zugreifen. Um jedoch etwas IDE-unabhängig zu haben, sollte dies zur Aufgabe:

for t in out: 
    print(t) 
+0

dies funktioniert gut, aber wenn ich die Liste aus drucken, sieht es wie folgt aus: [('a', 1), ('a', 1), ('a', 1) ...] Wie kann ich sicherstellen, dass es wie Ihr Ausdruck aussieht (aka vertikal) Danke! – glongo

1

Wie es bereits in den Kommentaren zu Ihrer Frage darauf hingewiesen, können Sie in einem Wörterbuch mehrere Einträge für denselben Schlüssel nicht haben.

Eine Möglichkeit wäre, ein Wörterbuch zu gehen, in dem jeder Titel nur einmal und Karten in die entsprechenden Anzahl auftritt:

d = {} 
next_id = 1 
for title in post_title_list: 
    if title not in d: 
     d[title] = next_id 
     next_id += 1 

Alternativ können Sie auch eine Liste mit einem Tupel (title,id) für jedes Element in der Liste erstellen :

+0

dies funktioniert gut, aber wenn ich die Liste aus drucken, sieht es wie folgt aus: [('a', 1), ('a', 1), ('a', 1), ...] wie kann ich sicher, es sieht aus wie Ihr Ausdruck (aka vertikal) Danke! – glongo

Verwandte Themen