我开始学习一些编码,但我一直在思考如何用 python 解决这个问题。我有一个字典列表,我必须遍历并打印最长的电影标题和标题的整数长度。
到目前为止,我可以打印长度(虽然是错误的胶片),但标题将“y”识别为最高值,而不是打印全名。
def get_max_movie_name_length():
for length in movies:
title = length["title"]
for name in movies:
film_title = name["title"]
return [max(film_title), len(title)]
get_max_movie_name_length()
名单:
[{'title': 'The Shawshank Redemption'},
{'title': 'The Godfather'},
{'title': 'The Dark Knight'},
{'title': 'The Godfather: Part II'}]
答案就像“肖申克的救赎”“24” 谢谢你
您只需要内置
max
函数和正确的 key
参数来比较列表元素。
>>> lst = [{'title': 'The Shawshank Redemption'},
... {'title': 'The Godfather'},
... {'title': 'The Dark Knight'},
... {'title': 'The Godfather: Part II'}]
>>> max(lst, key=lambda x: len(x['title']))
{'title': 'The Shawshank Redemption'}
>>> longest_title_show = max(lst, key=lambda x: len(x['title']))
>>> len(longest_title_show['title'])
24
首先,您需要循环遍历字典列表以找到标题最长的电影。您可以在迭代列表时跟踪最大长度和相应的电影标题。
这是更正后的代码:
def get_max_movie_name_length(movies):
max_length = 0
max_title = ""
for movie in movies:
title = movie["title"]
if len(title) > max_length:
max_length = len(title)
max_title = title
return max_title, max_length
movies = [
{'title': 'The Shawshank Redemption'},
{'title': 'The Godfather'},
{'title': 'The Dark Knight'},
{'title': 'The Godfather: Part II'}
]
longest_movie_title, title_length = get_max_movie_name_length(movies)
print("Longest movie title:", longest_movie_title)
print("Title length:", title_length)
已经提供了有效的解决方案 - 我想阐述为什么你的方法不起作用。
您有一个 for 循环,它迭代每个“电影对象”(每个字典代表一部电影):
for length in movies:
你所说的
length
是一个电影对象,或者一本字典。 length
这个名字不太好。为什么不直接称呼它为 movie
?我离题了,对于这个循环的每次迭代,你都会:
title = length["title"]
在第一次迭代中,您将创建一个名为
title
的变量,并将当前电影的标题绑定到该变量。然后,在循环的下一次迭代中,您将重新绑定 title
变量以指向下一部电影的标题。这一直持续到您迭代完所有电影对象为止,循环完成后,title
将指向最后一个电影的标题。所以,基本上这个循环没有做任何有用的事情,而且它肯定没有达到你的预期。
第二个 for 循环的情况类似。你所说的
name
是一个电影对象/单个字典。 movie
会是一个更好的名字。同样,您正在迭代电影集合,首先创建一个新变量 film_title
,然后将其重新绑定以指向下一部电影的标题。当这个循环完成时,film_title
将指向上一部电影的标题,就像title
一样。这些循环都没有达到您想要的效果。
换句话说,当两个循环完成后,你的变量将指向:
title => 'The Godfather: Part II'
film_title => 'The Godfather: Part II'
它们绑定到字符串
'The Godfather: Part II'
,因为这是您电影收藏中最后一部电影的标题。
然后,返回一个列表,其中第一个元素是
max(film_title)
。
这相当于
max('The Godfather: Part II')
。当您将字符串传递到内置 max
时,它将按字典顺序比较字符 - 根据它们在 ASCII 表中出现的顺序。例如在Python shell中进行简单的测试:
>>>max('abc')
'c'
我会为列表中的每个项目创建一个
(len(title), title)
元组。接下来,对元组列表进行排序(默认情况下,元组将按第一个元素排序,即长度)。最后,取出排序列表的最后一个元素。
您可以使用列表理解在一行中完成此操作:
data = [
{'title': 'The Shawshank Redemption'},
{'title': 'The Godfather'},
{'title': 'The Dark Knight'},
{'title': 'The Godfather: Part II'}
]
longest = sorted([(len(v), v) for d in data for v in d.values()])[-1]
print(longest) #(24, 'The Shawshank Redemption')
正如所指出的,使用 max 将是更好的选择。
longest = max([(len(v), v) for d in data for v in d.values()])