代码之家  ›  专栏  ›  技术社区  ›  BlueDolphin

在Python中,如何在一次调用中将方法结果附加到两个列表?[已关闭]

  •  2
  • BlueDolphin  · 技术社区  · 7 年前

    假设我有一个方法返回两个变量,我想把这两个返回结果附加到两个列表中。如果我使用temp变量,这是可行的,有更好的方法吗?就一个电话?

    如:

    def myfunc() :
        return "myname", "mypos"
    
    
    name_list = []
    pos_list = []
    
    # may I merge the following three lines in one call?
    name, pos = myfunc()
    name_list.append(name)
    pos_list.append(pos)
    
    4 回复  |  直到 7 年前
        1
  •  7
  •   poke    7 年前

    你的解决方案很好。

    如中所述 the Zen of Python 简单胜于复杂 可读性计数 因此,请关注这一点,而不是试图达到一个任意和无意义的目标,即使用最少的线或最少的变量。这些都无关紧要。

    此外,一种常见的方法是滥用列表理解。列表理解用于 创造


    所以,你的解决方案很好。在你的前提下,我认为这是将这两个值放入这两个单独列表的完美解决方案:

    name, pos = myfunc()
    name_list.append(name)
    pos_list.append(pos)
    

    你很容易理解发生了什么。此外,临时变量有一个有用的名称,可以很容易地理解该函数的多个返回值是什么。

    如果您没有此列表格式的要求,会有哪些替代方案?好的,这在很大程度上取决于您的用例,但您也可以在相同的列表中收集结果,作为您的函数返回的相同元组。甚至可以从函数中返回一个命名元组,这样就可以获得语义信息,即值是什么。或者返回一个自定义对象,或者如果您只是将名称映射到位置,则将其存储在字典中

    但是同时返回多个内容的函数本身通常不那么容易理解。因此,如果调用代码变得更具表现力,然后处理结果,这很好。这样,即使在一年内,也很容易理解。

        2
  •  1
  •   steliosbl    7 年前

    你可以做的一件事是:

    lists = [list1, list2, list3, list4]
    data = myfunc()
    for x, ls in zip(data, lists):
        ls.append(x)
    

    然而,只有当函数返回一个非常大的元组(表示大量列表)时,这样做才真正有意义。如果您的示例中只有两个类似项,那么最好坚持使用当前的解决方案。

        3
  •  1
  •   Elliot Godzich    7 年前

    我不知道你为什么想在一行中这样做,但这就完成了任务: list(map(lambda x: x[0].append(x[1]), zip([name_list, pos_list], my_func())))

    请注意,此语句不会返回任何有用的内容,它只是为您修改列表。

        4
  •  1
  •   Joe Iddon    7 年前

    如果 function 返回的更多值可以使用 list comprehension enumerate :

    [lst.append(myfunc()[i]) for i, lst in enumerate([name_list, pos_list])]
    

    这充分利用了以下事实: python lists mutable .