2016-07-22 14 views
0

ich eine sortierte Liste haben basierend auf dem Wert für die Schlüssel name wie folgt:generieren Liste der Wörterbücher, ohne benachbarte Wörterbuch Schlüssel/Wert gleich

s = [{'name': 'Bart', 'age': 12}, {'name': 'Bart', 'age': 19}, {'name': 'Bart', 'age': 1},{'name': 'Homer', 'age': 30}, {'name': 'Homer', 'age': 12},{'name': 'Simpson', 'age': 19}] 

Ich möchte die Elemente der Liste, so dass Wörterbücher mit der arrangieren gleicher Wert für Schlüssel namenicht treten nacheinander auf.

Erforderliche Ausgabe:

[{'name': 'Bart', 'age': 12}, {'name': 'Homer', 'age': 30}, {'name': 'Simpson', 'age': 19}, {'name': 'Bart', 'age': 19}, {'name': 'Homer', 'age': 12}, {'name': 'Bart', 'age': 1}] 

ODER

[{'name': 'Bart', 'age': 12}, {'name': 'Homer', 'age': 30}, {'name': 'Bart', 'age': 19}, {'name': 'Homer', 'age': 12}, {'name': 'Bart', 'age': 1},{'name': 'Simpson', 'age': 19}] 

Um eine der benötigten Ausgänge habe ich versucht, map und lambda mit Die Idee war, jedes name Element mit dem nächsten vergleichen Elemente name und wenn sie nicht übereinstimmen, tauschen Sie die Werte und die resultierende Liste zurück.

Unten ist der Code, den ich versuchte:

map(lambda x: x if x['name']!=next(iter(x))['name'] else None, s) 

Eine Sache, die nicht ist nicht funktioniert, dass next(iter(x) nicht das nächste Element zurückgekommen. Ich möchte auch wissen, warum und wenn die Lösung mit map und lambda erreicht werden kann?

+4

Dies ist nicht gut gestellt. Zum Beispiel, wenn Sie 3 Homers und 1 Bart haben, ist das nicht möglich. –

+0

Was ist, wenn es sich nicht um eine sortierte Liste handelt? Dann wäre die ideale Lösung homer, Bart, Homer, Homer. Ich möchte sie nur so weit wie möglich trennen. Fälle, in denen es nicht vermieden werden kann, ist in Ordnung. – Vaulstein

+0

Verwandte, wenn nicht genaue Duplikat: http://Stackoverflow.com/q/25285792/1639625 –

Antwort

1

Ich schrieb diese nach Ihren Anforderungen, wenn es nicht so kondensiert ist:

s = [{'name': 'Bart', 'age': 12}, {'name': 'Bart', 'age': 19}, {'name': 'Bart', 'age': 1}, 
    {'name': 'Homer', 'age': 30}, {'name': 'Homer', 'age': 12},{'name': 'Simpson', 'age': 19}] 

res=[] 

for m,n in zip(s, reversed(s)): 
    if m!=n: 
     res.append(m) 
     res.append(n) 
    else:  
     res.append(m) 
    if len(res)==len(s): 
     break 

print res 

Es sich die Tatsache zunutze macht, dass Sie bereits die sortierte Liste haben.

+0

Das scheint gut zu sein! Ich mag die Art, wie Sie die sortierte und die umgekehrte Liste verwendet haben, um zur Lösung zu kommen. Wird für ein paar Fälle testen. – Vaulstein

+0

Dies funktioniert nicht immer. Versuchen Sie es mit der (auch sortierten) Liste 's = [1,1,1,1,2,2,2,2,3,3,3,3]' Es wird die '1's und' 3's mischen gut, aber dann klumpen alle '2's zusammen. –

+0

Ja, funktioniert nicht in ähnlichen Fällen. – Vaulstein

Verwandte Themen