2013-04-17 20 views
-2

刚开始尝试我的手在Python和需要一些指针。清单出来二元组合和映射到数据

我期待基于某些参数的组合。

基本上,

parm1 = ['X1','X2'] 
parm2 = ['Y1','Y2'] 

我想什么从这个得到的是

['X1','Y1','X1','Y1'] 
['X1','Y1','X1','Y2'] 
['X1','Y1','X2','Y1'] 
['X1','Y1','X2','Y2'] 

我想一个可以使用二进制列表(itertools.product( “01”,重复= 4 ))并替换每个元素,即。

0 0 0 0 
0 0 0 1 

将代表

X1 Y1 X1 Y1 
X1 Y1 X1 Y2 

什么是这样做的最佳方法是什么?

编辑:让我来添加更多的信息。

Colour = ['Black','White'] 
Type = ['Car','Bike'] 

所以,我想这种格式分为以下

     ('Colour','Type','Colour','Type') 
('0', '0', '0', '0')-->('Black','Car','Black','Car') 
('0', '0', '0', '1')-->('Black','Car','Black','Bike') 
('0', '0', '1', '0')-->('Black','Car','White','Car') 
('0', '0', '1', '1')-->('Black','Car','White','Bike') 
('0', '1', '0', '0') 
('0', '1', '0', '1') 
('0', '1', '1', '0') 
('0', '1', '1', '1') 
('1', '0', '0', '0') 
('1', '0', '0', '1') 
('1', '0', '1', '0') 
('1', '0', '1', '1') 
('1', '1', '0', '0') 
('1', '1', '0', '1') 
('1', '1', '1', '0') 
('1', '1', '1', '1')-->('White','Bike','White','Bike') 

我知道这可以用一个if语句来完成对列表中的每个指标,但是否有其他方法?

再次编辑:

我写了这一点,但觉得有多大是一个更好的解决方案?

import itertools 
q=[] 
x=["","","",""] 
q=list(itertools.product("01", repeat=4)) 
for p in q: 
    if float(p[0]) == 0: 
     x[0]= "Black" 
    else: 
     x[0] = "White" 
    if float(p[1]) == 0: 
     x[1]= "Car" 
    else: 
     x[1] = "Bike" 
    if float(p[2]) == 0: 
     x[2]= "Black" 
    else: 
     x[2] = "White" 
    if float (p[3]) == 0: 
     x[3] = "Car" 
    else: 
     x[3] = "Bike" 
    print p 
    print x 
+1

是否有规则选择一些组合? – perreal

+3

您能否更好地解释一下,您如何从parm1和parm2获得您要求的输出列表? – mgilson

+2

您列出的名单'给出的四个(itertools.product(PARM1,parm2,PARM1,parm2))[4]',但我不知道,如果你只列出的前四个你想要的,只是没不要提你想要更多,或者如果这些只是你想要的四个,我不理解选择规则。 – DSM

回答

2

基本上你想要的就是一个平坦的版本:

from itertools import product 
nested = product(product(Colour, Type), repeat=2) 
print list(nested) 
# [(('Black', 'Car'), ('Black', 'Car')), 
# (('Black', 'Car'), ('Black', 'Bike')), 
# ... 
# ] 

所以在这里你去:

from itertools import product 
nested = product(product(Colour, Type), repeat=2) 

# flatten it by unpacking each element 
print [(a,b,c,d) for ((a,b),(c,d)) in nested] 

# alternative way to flatten the product 
from itertools import chain 
print [tuple(chain.from_iterable(x)) for x in nested] 

要转换(0,1)列表中,您可以使用这些数字作为指标:

from itertools import product 

Colour = ['Black','White'] # so Color[0] == 'Black' 
Type = ['Car','Bike'] 

#make that list 
nested = product((0,1), repeat=4) # use numbers not strings 
print [(Colour[a], Type[b], Colour[c], Type[d]) for (a,b,c,d) in nested] 
+0

我可能在嵌套的''或'chain.from_iterable'中使用'[tuple(chain(* p))';似乎很遗憾使用'repeat'来避免硬编码,然后在最后重新引入它。 – DSM

+0

我在'嵌套=产品得到一个语法错误(产品(颜色,类型),重复= 2))' – Ash

+0

我傻,想通了,'itertools.product' – Ash