2016-08-10 32 views
0

使用Python 2.7。我有一組由ID標籤的數據:我有兩組數據,我需要構建一個數據結構,將它們組織成組。 (Python)

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

,另一組由不同的ID標籤:

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

正如你所看到的,集合是一到一個和每個MISC標記與SET2中的相應ID相關。因此,例如,SET1中的第一個元素{'MISC': u'2759'}需要與SET2中的第一個元素相關:u'15672542c8ed280b'

因此理想情況下,我想建立一個數據結構,像這樣:

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

我嘗試這種做法,到目前爲止,但因爲我用兩個for循環我遍歷數據的兩倍,並獲得了非常難看看起來集:

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

任何人都有一個更優雅的工作解決方案,他們可以指出我在正確的方向?

+1

如果他們是真正的集元素沒有任何特定的順序,因此2套之間要素不能對應。你真的認爲你有2 *名單*嗎? –

+0

你爲什麼不直接郵編? –

+0

請注意,在Python中,set是一種數據類型。最好重新命名你的列表以避免混淆。 – ayhan

回答

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

這應該給你你想要什麼,我想,假設你的「套」(他們實際上是列表)的長度相同。

+0

是的,我的道歉,我的意思是名單。一切都是新的,所以我的術語不是最好的,謝謝糾正我:) –

+0

但你仍然迭代兩次:一次爲列表理解,一次爲zip。 – chapelo

4

在一個迭代,你可以嘗試:

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

這將產生的指定集合列表。

這說明更清楚如何在一個迭代循環兩份名單:

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

這工作很好,謝謝! –

+0

這還不是兩次迭代?一個用於zip,另一個用於列表理解? – ballsatballsdotballs

+0

在Python 3中,zip是一個生成器。生成器將在列表理解迭代以形成列表時被消耗。在Python 2中,zip生成列表(除非您使用'future_builtins'中的itertools.izip或zip)。在任何情況下,你構建它的方式在Python 3中都會導致2次迭代,因爲你需要首先產生內部列表理解,然後zip將只是一個你必須重新迭代的生成器。看到我編輯的答案,更清楚地顯示如何只做一次。 – chapelo

相關問題