仅使用纯函数创建一个包含值的列表 - python

Create a list with a value in it using only pure functions - python

为什么这个问题没有简单的解决方案是因为我只需要使用 pure functions.

来解决

仅使用来自 Python 的函数式编程页面 (https://docs.python.org/3/howto/functional.html#) 的纯函数,如何创建一个包含值的列表?如果我们想创建一个包含值的列表,我们(在代码中)只需要

x = [1]

我不认为 [] 是我们在这里查看的函数的一部分,因为它没有签名并且不能像任何其他函数一样调用。

仅使用函数来做到这一点并非易事。我的一个想法是使用 list() 创建一个新列表,然后向其附加值。但是 list().append 是可变的,并且不会 return 一个新的或包含其中项目的列表。

我真正想做的是把["a","b","c"]变成[["a"],["b"],["c"]],有上面的约束。

已经提出了其他建议,比如创建我自己的(纯)函数来做我想做的事情:

def create_list(value) -> list:
    return [value]

然后只需执行 map(create_list, ["a","b","c"]) 即可获得解决方案。 但这是一个自定义函数,并非来自任何 python 包函数(如前所述,在 https://docs.python.org/3/howto/functional.html 内)

单元素:

def to_list(elem):
    return list(range(elem, elem+1)))

通过列表理解将[1,2,3]转换为[[1], [2], [3]](可以很容易地更改为map):

return [to_list(el) for el in input_list]

没有(丑陋,但有效^^)

import itertools

def make_gen(elem):
    yield elem

def to_list(elem):
    return list(make_gen(elem))

def helper(elem, l):
    return list(itertools.chain(to_list(to_list(elem)), l))

def convert(l):
    if not l:
        return []
    return helper(l[0], convert(l[1:]))


print(convert([1, 2, 3]))

Using only pure functions from Python's functional programming page (https://docs.python.org/3/howto/functional.html#), how can one create a list with a value in it? If we'd like to create a list with number 1 in it

您可能会利用生成器,因为其中描述了生成器

def justone():
    yield 1
lst = list(justone())
print(lst)

输出

[1]

justone 是函数(可以使用 inspect.isfunction 检查)并且是纯函数(因为它不会改变外部的任何东西)

lst=[1,2,3];
#this will print [[1],[2],[3]]
print(list(map(lambda x: [x],lst)));

在您 link 的文档中,有对迭代器和生成器的引用,它们是 Python(和其他语言)中存在的强大结构。您可以考虑一个函数来构建一个列表,如下所示:

def list_from_args(*args):
    return [*args]

这是迭代器功能的(多余的)包装器。您可以利用 Python 中的迭代器模式来完成很多工作,无论是 creating/consuming 对象(例如列表、元组、字典),还是用于处理数据(例如 reading/writing 到文件行-逐行,对 API 或数据库查询等进行分页)

上面的代码执行以下操作,例如:

>>> example = list_from_args(1, 'a', 'ham', 'eggs', 44)
>>> example
[1, 'a', 'ham', 'eggs', 44]

我将上述功能标记为多余的原因:通常,如果您需要即时创建列表,可以使用 list comprehensions

为了确保不可变性,您可能希望使用元组而不是列表(或者对您的列表非常严格)。

使用列表理解是一种有效的函数式方法:

A = [1,2,3]
B = [ [i] for i in A ]        # [[1], [2], [3]]

或元组:

A = (1,2,3)
B = tuple( (i,) for i in A )  # ((1,), (2,), (3,))

如果你必须使用函数,那么 map() 可能是一个很好的解决方案:

A = [1,2,3]
B = list(map(lambda i:[i],A))

如果连 [i] 都被禁止(但为什么会这样),您可以使用 a 函数直接从其参数创建列表:

def makeList(*v): return list(*v)

A = makeList(1,2,3)
B = makeList(*map(makeList,A))

# combined
makeList(*map(makeList,makeList(1,2,3)))

顺便说一句,函数式编程不是关于“只使用函数”,它更多的是关于结果的非可变性(以及避免副作用)。你可能想问问是谁派你来的。

这只使用 https://docs.python.org/3/library/functional.html

中的函数
import functools
import itertools

map(
    list, 
    map(
        functools.partial(
            itertools.repeat, 
            times=1,
        ), 
        [1,2,3]
    )
)

functools.partial 创建一个 itertools.repeat 的新函数,并将“times”参数设置为 1。然后列表中的每个值重复一次,并使用 list 变成一个新列表函数。

>>> [[1], [2], [3]]