2016-08-10 2 views
0

Verwenden von Python 2.7. Ich habe eine Reihe von Daten von ID-Tags aus:Ich habe zwei Sätze von Daten und ich muss eine Datenstruktur aufbauen, die sie in Sätzen organisiert. (Python)

SET1=[{'MISC': u'2759'}, {'MISC': u'2759'}, {'MISC': u'2759'}, {'MISC': u'2758'},{'MISC': u'2758'}, {'MISC': u'1751'}] 

und einen anderen Satz, bestehend aus verschiedenen ID-Tags:

SET2= [u'15672542c8ed280b', u'1566b77702f8865f', u'1565c2241aebb314', u'155c6888c507e365', u'155c5b8ded9a7c03', u'155c1173f58f1494'] 

Wie Sie sehen können, sind die Sätze eins-zu-eins und jeder MISC Das Tag bezieht sich auf die entsprechende ID in SET2. So muss zum Beispiel das erste Element in SET1, {'MISC': u'2759'}, mit dem ersten Element in SET2 in Beziehung stehen: u'15672542c8ed280b'.

So ideal, möchte ich wie so eine Datenstruktur aufzubauen:

Matched_IDS=[{2759, 15672542c8ed280b}, {2759, 1566b77702f8865f} , {2759, 1565c2241aebb314}, {...}, {...} ] 

ich diesen Ansatz versucht, so weit, aber da ich zwei for-Schleifen verwendet iteriert ich zweimal die Daten über, und eine sehr hässlich suchen Set:

MSGMatch=[] 
    for a in SET1: 
     for b in SET2: 
      MSGMatch.append({str(a),str(b)}) 
    print(MSGMatch) 

Wer hat eine elegantere, funktionierende Lösung, dass sie mich in die richtige Richtung auf mich hinweisen könnten?

+1

Wenn sie wirklich Sets sind, Elemente haben keine bestimmte Reihenfolge und somit Elemente zwischen 2 Sätzen entsprechen nicht. Meinst du wirklich, du hast 2 * Listen *? –

+0

Warum reißt du nicht einfach? –

+0

Beachten Sie, dass in Python set ein Datentyp ist. Es wäre besser, Ihre Listen umzubenennen, um Verwirrung zu vermeiden. – ayhan

Antwort

3
zip([m['MISC'] for m in SET1], SET2) 

Das sollte Ihnen geben, was Sie wollen, denke ich, vorausgesetzt, Ihre "Sets" (sie sind tatsächlich Listen) sind gleich lang.

+0

Ja, meine Entschuldigung, ich meine Listen. Irgendwie neu zu allem, so dass meine Terminologie noch nicht die beste ist, danke, dass du mich korrigierst :) –

+0

Aber du wiederholst noch zweimal: einmal für das Listenverständnis und wieder für den Zip. – chapelo

4

In einer Iteration, könnten Sie versuchen:

[{a['MISC'], b} for a, b in zip(SET1, SET2)] 

Dies wird die Liste von Sätzen von Ihnen angegebenen produzieren.

Dies zeigt deutlicher, wie in einer Iteration beiden Listen iterieren:

result = [] 
for i, a in enumerate(SET1): 
    result.append({a['MISC'], SET2[i]}) 
+0

Das hat wunderbar funktioniert, danke! –

+0

Sind das nicht immer noch zwei Iterationen? Einer für den Zip und einer für das Listenverständnis? – ballsatballsdotballs

+0

In Python 3 ist zip ein Generator. Der Generator würde verbraucht werden, während das Listenverständnis zur Bildung der Liste iteriert wird. In Python 2 erstellt zip die Liste (es sei denn, Sie verwenden itertools.izip oder zip von 'future_builtins'). In jedem Fall würde die Art und Weise, wie Sie es konstruierten, sogar in Python 3 2 Iterationen verursachen, weil Sie zuerst das Verständnis der inneren Liste erzeugen müssen, und dann wäre zip nur ein Generator, den Sie erneut durchlaufen müssten. Sehen Sie meine bearbeitete Antwort, die deutlicher zeigt, wie Sie es in nur einem Schritt tun. – chapelo

Verwandte Themen