繁体   English   中英

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

[英]Dataquest: I've just learned how to define a function in python. Now I want to run it in a loop.

我是 Python 初学者,我使用 dataquest 学习。 我想在循环中使用自定义函数来检查列表中的每个项目,它是否是彩色电影,并将结果(真,假)添加到列表中。 现在该函数仅返回 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

我很感激你的帮助!

问题出在这一行

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

input_lst参数应该是input_lst=item 现在,您每次都将整个列表列表传递给您的函数。

未提供 .csv 文件,但我认为读数是正确的,它返回一个类似于您在代码第一行中提供的列表; 特别是,您试图将数据打包到列表列表中(einmalig 变量是由 csv 文件的行获得的列表,然后您将在另一个列表 aufbereitet 中找到的每个 einmalig 附加到列表中)。

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

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 循环时,变量 item 在每次迭代时都会与 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

用更少的行获得相同的结果。

对于此类任务,函数式编程有时更具可读性和适应性:

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]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM