检查列表

时间:2016-11-15 21:30:44

标签: python list

有点奇怪的我来到这里......

基本上我说我的列表里面有列表。

ratings = [
    # ''' 1 star '''
    ["Strangers on a Train", "Anchorman", "Saw", "Suicide Squad"],

    # ''' 2 star '''
    ["Shutter Island", "Shaun of the Dead", "Scream", "Indiana Jones"],

    # ''' 3 star'''
    ["Goodfellas", "Mr Bean", "The Ring", "Dark Knight"],

    # ''' 4 star'''
    ["Scarface", "Hot Fuzz", "Nosferatu", "Die Hard"],

    # ''' 5 star'''
    ["Pulp Fiction", "Airplane", "The Omen", "Deadpool"]
]

显然这是一个电影列表,在列表中有5个列表,每个电影的评分为5,尽管这个背景很无用。

def rating():
    if userInfo[7] == "1":
        return range(5)
    elif userInfo[7] == "2":
        return range(2, 5)
    elif userInfo[7] == "3":
        return range(3, 5)
    elif userInfo[7] == "4":
        return range(4, 5)
    else:
        return range(5, 5)

这是一个功能,根据他们希望看到的胶片的最低评级,返回一个范围。所以说他们的最低评分为4,他们只会看到评分为4和5的电影。

说他们有一个电影列表

movies = ["Strangers on a Train", "Anchorman", "Shutter Island",
          "Shaun of the Dead", "Goodfellas", "Mr Bean",
          "Scarface", "Hot Fuzz", "Pulp Fiction", "Airplane"]

现在我要删除此列表中不属于等级4或以上的所有电影。

我试过

new = []
for item in movies:
    if item not in in ratings[rating()]:
        new.append(item)

但这不起作用,因为我不能使用范围来搜索大列表中的多个列表,因为它需要是一个整数。

我知道这对于这么小的问题来说是一个巨大的帖子,但我的大脑正在死亡,我一直试图这样做几个小时,我想睡觉,但需要这样做。

1 个答案:

答案 0 :(得分:2)

首先,对于高性能搜索,评级数据实际上并不是最佳的。因此,我会使用字典理解来制作一个字典,其中包含电影名称作为键和评级作为值:

movie_rating = {name:i+1 for i,mlist in enumerate(ratings) for name in mlist}

(这本词典可以多次重复使用)

然后我将此数据应用于列表推导中的第二个列表。未评级的电影获得0分。

print([x for x in movies if movie_rating.get(x,0) >= 4])

结果:

['Scarface', 'Hot Fuzz', 'Pulp Fiction', 'Airplane']

此方法可能不是最短的,但具有保持准确评级信息的优势,而不是“高于n的评级”。

您可以阅读其他SO Q&中的list and dict comprehensions。答:这个问题已经很好地解释了listcomps,答案解释了dictcomps。