有点奇怪的我来到这里......
基本上我说我的列表里面有列表。
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)
但这不起作用,因为我不能使用范围来搜索大列表中的多个列表,因为它需要是一个整数。
我知道这对于这么小的问题来说是一个巨大的帖子,但我的大脑正在死亡,我一直试图这样做几个小时,我想睡觉,但需要这样做。
答案 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。