我有一本字典:
mydict = {'item1':[1,2,3],'item2':[10,20,30]}
我想创建两者的笛卡尔积,以便得到每个可能对的元组。
output: [(1,10),(1,20),(1,30),
(2,10),(2,20),(2,30),
(3,10),(3,20),(3,30)]
似乎有一种简单的方法可以做到这一点,如果我有三个项目它会扩展。有点像动态循环次数。感觉就像我错过了一个明显的方法来做到这一点...
答案 0 :(得分:12)
itertools.product()
函数将执行此操作:
>>> import itertools
>>> mydict = {'item1':[1,2,3],'item2':[10,20,30]}
>>> list(itertools.product(*mydict.values()))
[(10, 1), (10, 2), (10, 3), (20, 1), (20, 2), (20, 3), (30, 1), (30, 2), (30, 3)]
如果您需要控制生成的元组的顺序,可以执行
itertools.product(mydict['item1'], mydict['item2'])
答案 1 :(得分:2)
你也可以使用两个循环强制它
public class RegisterApp extends AsyncTask<Void, Void, String> {
private static final String TAG = "GCMRelated";
Context ctx;
String id_viaje;
String msj;
String tlf;
GoogleCloudMessaging gcm;
private int appVersion;
public RegisterApp(Context ctx, GoogleCloudMessaging gcm, int appVersion, String id_viaje, String tlf){
this.ctx = ctx;
this.gcm = gcm;
this.id_viaje=id_viaje;
this.tlf=tlf;
this.appVersion = appVersion;
}
所有这些代码都是通过mydict = {'item1':[1,2,3],'item2':[10,20,30]}
x = []
for i in mydict['item1']:
for j in mydict['item2']:
x.append((i,j))
中的所有项目,然后遍历mydict['item1']
中的每个项目,然后将一对项目添加到新列表中。
它会给你这个结果:
mydict['item2']
答案 2 :(得分:0)
你可以做两个循环。 - 第一个将跟踪第一个项目列表的索引位置。 - 第二个循环将遍历第二个循环中的每个项目。 - 在遍历所有项目之后,第一个for循环将增加到其列表中的下一个项目,第二个循环将再次运行第二个列表等。
答案 3 :(得分:0)
您可以使用List Comprehensions:
[(i, j) for i in mydict['item1'] for j in mydict['item2']]