2011-01-06 45 views
6
#!/usr/bin/python 
# 
# Description: I try to simplify the implementation of the thing below. 
# Sets, such as (a,b,c), with irrelavant order are given. The goal is to 
# simplify the messy "assignment", not sure of the term, below. 
# 
# 
# QUESTION: How can you simplify it? 
# 
# >>> a=['1','2','3'] 
# >>> b=['bc','b'] 
# >>> c=['#'] 
# >>> print([x+y+z for x in a for y in b for z in c]) 
# ['1bc#', '1b#', '2bc#', '2b#', '3bc#', '3b#'] 
# 
# The same works with sets as well 
# >>> a 
# set(['a', 'c', 'b']) 
# >>> b 
# set(['1', '2']) 
# >>> c 
# set(['#']) 
# 
# >>> print([x+y+z for x in a for y in b for z in c]) 
# ['a1#', 'a2#', 'c1#', 'c2#', 'b1#', 'b2#'] 


#BROKEN TRIALS 
d = [a,b,c] 

# TRIAL 2: trying to simplify the "assignments", not sure of the term 
# but see the change to the abve 
# print([x+y+z for x, y, z in zip([x,y,z], d)]) 

# TRIAL 3: simplifying TRIAL 2 
# print([x+y+z for x, y, z in zip([x,y,z], [a,b,c])]) 

[更新]一个缺少的东西,怎么样,如果你真的有for x in a for y in b for z in c ...,即结构arbirtary量,书写product(a,b,c,...)很麻烦。假设您有一个列表,例如上面例子中的d。你能更简单吗? Python让我们做unpacking*a列表和字典评估与**b但它只是符号。为了进一步研究here,任意长度和简化这些怪物的嵌套for-loops超出了SO。我想强调标题中的问题是开放式的,所以如果我接受一个问题,不要误导!我该如何简化“for x in a for y in b for z in c ...”与无序?

+0

@HH,我加入到我的回答例如。 `product(* d)`相当于`product(a,b,c)` – 2011-01-06 11:43:15

回答

8
>>> from itertools import product 
>>> a=['1','2','3'] 
>>> b=['bc','b'] 
>>> c=['#'] 
>>> map("".join, product(a,b,c)) 
['1bc#', '1b#', '2bc#', '2b#', '3bc#', '3b#'] 

编辑:

您可以使用产品上一堆东西像你想也

>>> list_of_things = [a,b,c] 
>>> map("".join, product(*list_of_things)) 
12

试试这个

>>> import itertools 
>>> a=['1','2','3'] 
>>> b=['bc','b'] 
>>> c=['#'] 
>>> print [ "".join(res) for res in itertools.product(a,b,c) ] 
['1bc#', '1b#', '2bc#', '2b#', '3bc#', '3b#']