我有两个有限集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'}]
我认为下面的代码可以满足我的需求,但是我想变得更好地成为Pythonic,所以我想知道是否有一种不需要递归帮助器功能的单行代码。
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
来处理最困难的部分,然后将其包装在listcomp中:
>>> 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'}
列表中的第一个。)
请记住,如果有根本无需兑现名单一次,你可以更换[
和]
使用(
,并)
使用一台发电机的表达,而不是listcomp,你可以遍历的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句