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]

我知道我目前的做法没有任何问题。我很好奇它是否可以完成。

4

3 回答 3

2

我想你可以使用三重“嵌套”的集合理解。

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

如果您想要返回列表,只需将其包装在对list.

于 2015-04-03T19:48:52.843 回答
1

如果您想要的是 otas 字典中没有重复的房间,那么:

rooms = set([r for resort in otas.values() for room in resort.values() for r in room])
于 2015-04-03T19:50:06.677 回答
1

你可以试试这个

rooms = list(set(reduce(lambda x, y: x+y, [item for x in otas.values() for item in x.values()])))
于 2015-04-03T20:07:58.413 回答