我有两个有限集 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/