我是一名python初学者,我学习使用dataquest。 我想在循环中使用自定义函数来检查列表中的每个项目,无论它是否是彩色电影,并将结果(True,False)添加到列表中。现在该函数仅返回False,也是多次返回。我有什么提示我做错了吗?
wonder_woman = ['Wonder Woman','Patty Jenkins','Color',141,'Gal Gadot','English','USA',2017]
def is_usa(input_lst):
if input_lst[6] == "USA":
return True
else:
return False
def index_equals_str(input_lst, index, input_str):
if input_lst[index] == input_str:
return True
else:
return False
wonder_woman_in_color = index_equals_str(input_str="Color", index=2, input_lst=wonder_woman)
# End of dataquest challenge
# My own try to use the function in a loop and add the results to a list
f = open("movie_metadata.csv", "r")
data = f.read()
rows = data.split("\n")
aufbereitet = []
for row in rows:
einmalig = row.split(",")
aufbereitet.append(einmalig)
# print(aufbereitet)
finale_liste = []
for item in aufbereitet:
test = index_equals_str(input_str="Color", index=2, input_lst=aufbereitet)
finale_liste.append(test)
print(finale_liste)
同样在pastebin:https://pastebin.com/AESjdirL
感谢您的帮助!
答案 0 :(得分:3)
问题出在这一行
test = index_equals_str(input_str="Color", index=2, input_lst=aufbereitet)
input_lst
参数应为input_lst=item
。现在,您每次都将整个列表列表传递给您的函数。
答案 1 :(得分:1)
没有提供.csv文件,但我认为读数是正确的,它会返回一个类似于您在代码第一行中提供的列表;特别是,您正在尝试将数据打包到列表列表中(einmalig变量是由csv文件的行获取的列表,然后您将在另一个列表中找到的每个einmalig附加到aufbereitet)。
问题不在于函数本身,而在于您作为输入提供的参数:当您执行
时test = index_equals_str(input_str="Color", index=2, input_lst=aufbereitet)
你应该看到第三个参数不是与单个电影数据相对应的列表,而是整个电影列表。这意味着函数中的Python解释器为aufbereitet中的每个项执行此迭代(即,迭代n次,其中n是aufbereitet的长度):
if aufbereitet[2] == "Color":
return True
else:
return False
很明显,即使电影是彩色的,列表(aufbereitet的元素)和字符串之间的比较默认返回False,因为它们是不同的类型。
要纠正问题,只需更改行
即可test = index_equals_str(input_str="Color", index=2, input_lst=aufbereitet)
与
test = index_equals_str(input_str="Color", index=2, input_lst=item)
因为,当你以这种方式使用for循环时,变量项会在每次迭代时使用aufbereitet中的元素进行更改。
请注意,如果您正在学习使用函数仍然可以,但您可以使用算法的内联版本(这就是Python着名的版本)。使用
finale_liste = [item[2] == "Color" for item in aufbereitet]
您无需定义函数且不使用for循环即可获取列表。那叫做列表理解。
你可以做的另一件事是让代码更加Pythonic - 如果你想要使用这些函数 - 就是做
这样的事情def index_equals_str(input_lst, index, input_str):
return input_lst[index] == input_str
与较少的行具有相同的结果。
答案 2 :(得分:1)
功能编程有时更具可读性,适用于此类任务:
from functools import partial
def index_equals_str(input_lst, index=1, input_str='Null'):
return input_lst[index] == input_str
input_data = [['Name1', 'Category1', 'Color', 'Language1'],
['Name2', 'Category2', 'BW', 'Language2']]
result = list(map(partial(index_equals_str, input_str='Color', index=2), input_data))
# output
# [True, False]