【问题标题】:A function that creates a lists with input from another function使用来自另一个函数的输入创建列表的函数
【发布时间】:2019-06-11 07:35:35
【问题描述】:

我有一个可以运行几次的函数(在递归函数中,因此带有“while”条件)。每次运行时,它都会return某个整数。例如,第一次运行returns3,第二次运行5,第三次运行9

现在我需要将这些returns 保存在一个列表中。所以我想创建一个单独的函数来获取这些值并存储它们。所以我正在寻找的最终状态是拥有list = [3,5,8]

B = [3,6,5,7,8,10]
def function_1(A):
    for i in range(len(A)/2):
         factor = A[2*i]
         list_of_diagonals(factor)
    return factor`

def list_of_diagonals(d):
    factor_list = []
    factor_list = factor_list.append(d)
    return factor_list`

现在我希望print function_1(B) 会产生[3,5,8],但它只会产生8

我认为这与我在函数开头定义 factor_list=[] 的事实有关,但我该如何解决呢?

【问题讨论】:

  • 你只是从function_1返回factor,它保存了A[2*i]的最后一个迭代值
  • 你试过使用yield了吗?
  • 我不认为“递归”与“while”条件相同。您的代码中也没有while 语句。只是一个for 循环。
  • 我不熟悉yield。但是我在第一个函数中返回factor,只是为了确保我可以在第二个函数中使用它。我第二次返回factor_list,这样我以后可以使用它,对吧?
  • @SpghttCd 该函数必须在它被调用之前定义,而不是在它出现在另一个定义之前。 Python 只是在运行时在 globals dict 中查找名称。我认为函数的顺序没有任何问题。

标签: python list function iteration


【解决方案1】:

使用生成器,您可以这样做,更好、更易读且更 Python 化

B = [3,6,5,7,8,10]
def function_1(A):
    for i in range(len(A)//2):
         factor = A[2*i]
         yield factor

result = list(function_1(B))
# output [3, 5, 8]

【讨论】:

  • @Mathbeginner 那就是我所说的yield
【解决方案2】:

每当发生对角线列表调用时,您都会创建空的 factor_list。实际上,您不需要其他函数来将结果存储在 list 中,请尝试以下代码:

B = [3,6,5,7,8,10]
def function_1(A):
    l1 = []
    for i in range(len(A)/2):
         factor = A[2*i]
         l1.append(factor)
    return l1
print function_1(B)

【讨论】:

  • 您在发帖前检查过。这似乎不起作用。
  • @VineethSai 什么在这里不起作用你能解释一下吗?是的..它正在工作我得到想要的输出[3, 5, 8]
  • 也许这是 python3.x 中 range 作为生成器的问题
  • TypeError: 'float' object cannot be interpreted as an integer
  • 奇怪..最后它工作正常..我正在使用 python ...你使用相同的 B 列表吗?
【解决方案3】:

其他用户已经在第一种方法中指出了直接使用列表的选项,但我建议一种重构代码以使其工作的方法。

def function_1(array):
    list_of_diagonals_ = [] # <-- initialize the recipient
    for i in range(len(array)//2): # <-- # // to return integer
         factor = array[2*i]
         list_of_diagonals_ = list_of_diagonals(factor, list_of_diagonals_) # <-- call the function and store to recipient
    return list_of_diagonals_ # <-- return the recipient

def list_of_diagonals(element, factor_list = None): # <-- need an argument to memorize past results
    if factor_list == None: factor_list = [] # <-- just in case
    factor_list.append(element)
    return factor_list

B = [3,6,5,7,8,10]
print (function_1(B))
#=> [3, 5, 8]

【讨论】:

  • 不错,我很感激它,它对我的​​理解绝对有用。
【解决方案4】:

以下代码在Python2.7下

在 itertools 中使用 islice 可以处理您的情况

from itertools import islice

B = [3, 6, 5, 7, 8, 10]


def function_1(A):
    return islice(A, 0, None, 2)

# [3, 5, 8]
print(list(function_1(B)))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-22
    • 2015-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多