循环列表中的每个项目

时间:2015-05-14 01:49:44

标签: python dictionary cartesian-product

我有一本字典:

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)]

似乎有一种简单的方法可以做到这一点,如果我有三个项目它会扩展。有点像动态循环次数。感觉就像我错过了一个明显的方法来做到这一点...

4 个答案:

答案 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']]