簡體   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