Dataquest:我刚刚学习了如何用python定义函数。现在我想在一个循环中运行它。

2024-09-30 16:42:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我是一个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

谢谢你的帮助!你知道吗


Tags: infalsetrueinputindexreturncolorwonder
3条回答

问题就在这条线上

test = index_equals_str(input_str="Color", index=2, input_lst=aufbereitet)

input_lst参数应该是input_lst=item。现在,每次都要将整个列表传递给函数。你知道吗

函数式编程有时更具可读性,也更适合此类任务:

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]

没有提供.csv文件,但我假设读取是正确的,它会返回一个与您在代码的第一行中提供的列表类似的列表;特别是,您试图将数据打包到一个列表列表中(einmalig变量是一个由csv文件的行获得的列表,然后将在另一个列表中找到的每个einmalig追加到另一个列表中,奥夫贝雷特)。你知道吗

问题不在于函数本身,而在于作为输入提供的参数:当您这样做时

test = index_equals_str(input_str="Color", index=2, input_lst=aufbereitet)

您应该看到,第三个参数不是对应于单个电影数据的列表,而是电影的整个列表。这意味着函数中的Python解释器对aufberitet中的每个项都执行此迭代(即,迭代n次,其中n是aufberitet的长度):

if aufbereitet[2] == "Color":
    return True
else:
    return False

很明显,即使电影是彩色的,列表(aufberitet的元素)和字符串之间的比较在默认情况下也返回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循环时,变量项在每次迭代时都会随着aufberitet中的元素而改变。你知道吗

请注意,如果您正在学习使用函数仍然可以,但是您可以使用算法的内联版本(这就是Python的著名之处)。使用

finale_liste = [item[2] == "Color" for item in aufbereitet]

获取列表时不需要定义函数,也不需要使用for循环。这叫做列表理解。你知道吗

如果你想使用函数,你可以做的另一件事就是做

def index_equals_str(input_lst, index, input_str):
    return input_lst[index] == input_str

用更少的线就能得到同样的结果。你知道吗

相关问题 更多 >