python - Python中从X到Y的所有函数的列表

标签 python

我有两个有限集 X 和 Y,我想生成一个包含从 X 到 Y 的所有函数的列表(即从 X 到 Y 的所有映射,其中每个映射表示为一个字典,其键为X 的元素,其值是 Y 的元素;请注意,从 X 到 Y 的映射对于 X 的每个元素都必须有一个键。例如,如果 X = {1,2} 且 Y = {'a','b'},我想获取以下字典列表。

[{1:'a',2:'a'},{1:'a',2:'b'},{1:'b',2:'a'},{1:'b',2:'b'}]

我认为下面的代码满足了我的需求,但我正在努力变得更好,所以我想知道是否有一个不需要递归辅助函数的单行代码。

def ntuples(A,n):
    if n == 0:
        return {()}
    else:
        return {x + (a,) for x in ntuples(A,n-1) for a in A}
def X_to_Y(X,Y):
    return [{x:y[i] for (i,x) in enumerate(X)} for y in ntuples(Y,len(X))]

最佳答案

追逐俏皮话与Pythonic相反,但避免递归通常是一个好主意。在这种情况下,我们可以使用 itertools.product处理困难的部分,然后将其包装在列表中:

>>> from itertools import product
>>> X = {1,2}
>>> Y = {'a','b'}
>>> [dict(zip(X,y)) for y in product(Y,repeat=len(X))]
[{1: 'a', 2: 'a'}, {1: 'b', 2: 'a'}, {1: 'a', 2: 'b'}, {1: 'b', 2: 'b'}]

(我假设您不太关心是否看到 {1: 'b', 2: 'a'} 还是 {1: 'a', 2:'b'} 在列表中第一个。)

请记住,如果不需要一次具体化列表,您可以将 [] 替换为 () 使用生成器表达式而不是列表计算,您可以对其进行迭代。

关于python - Python中从X到Y的所有函数的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28649683/

相关文章:

python - 如何覆盖 Django 的默认管理模板和布局

python - RSA 加密/解密不返回原始消息

python - 如何将 Flask 应用程序连接到在 Docker 中运行的 SQLite DB?

python - 为什么在 python 中给 str func 一个 unicode 字符串会抛出异常?

python - 对每个值有两个嵌套键的 Python 字典求和

python - Django 模型对象初始化

python - 在 Bokeh 0.5.0 中,无法指定图表的大小,并且以前的版本出现在同一个输出文件中

python - 如何在 Python 中判断进程 ID

python - 在 Centos 上的 Pycharm 中哪里可以找到 Python-3.6.1 解释器

python - 接收带字符的字符串