1

我試圖通過字典來簡化嵌套for循環來建立一個唯一值(房間大小是嵌套字典值中的列表)的列表。我已經將代碼縮減到了4行,但很好奇它是否可以以任何方式通過列表理解減少到1行。簡化嵌套循環的理解

這是一個例子Python字典:

otas = { 
    Orbitz: { 
     u'Las Vegas': [u'1 Bedroom Suite B-side'] 
    }, 
    Expedia: { 
     u'Los Angeles': [u'2 Bedroom Lockoff', u'1 Bedroom Deluxe (A-side)', u'3 Bedroom Deluxe'] 
    }, 
    Priceline: { 
     u'New York': [u'1 Bedroom Deluxe (A-side)'] 
    }, 
    Travelocity: { 
     u'Chicago': [u'1 Bedroom Deluxe (A-side)', u'2 Bedroom Lockoff'] 
    } 
} 

這是四行代碼:

rooms = [] 
for resort in otas.values(): 
    for room in resort.values(): 
     rooms += [r for r in room if r not in rooms] 

我知道沒有什麼錯目前我做的方式它。如果可以完成,我大多很好奇。

回答

1

如果你想要的是不重複的在線旅行社字典,然後房間:

rooms = set([r for resort in otas.values() for room in resort.values() for r in room]) 
2

我想你可以使用三重「嵌套」的理解。

rooms = {roomtype 
     for service in otas 
     for location in otas[service] 
     for roomtype in otas[service][location]} 

如果你想有一個列表回來,只是包裝,在調用list

+0

偉大的答案!我沒有意識到可以用Python做到這一點。 – Ashalynd 2015-04-03 20:00:18

1

你可以試試這個

rooms = list(set(reduce(lambda x, y: x+y, [item for x in otas.values() for item in x.values()])))