How can I simplify "for x in for y in b for z in c ..." with unordered?

#!/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])]) 

[Refresh] The thing is missing if you really have for x in a for y in b for z in c ... , i.e. the arbilary number of structures spelling product(a,b,c,...) is cumbersome. Suppose you have a list of lists, such as d in the example above. Can you make it easier? Python let's unpacking with *a for lists and evaluating a dictionary with **b , but this is just a notation. Nested loops of arbitrary length and simplifications of such monsters are outside of SO, for further research here . I want to emphasize that the problem in the title is open, so do not be mistaken if I accept the question!

+6
python list-comprehension cartesian-product unordered
source share
2 answers
 >>> from itertools import product >>> a=['1','2','3'] >>> b=['bc','b'] >>> c=['#'] >>> map("".join, product(a,b,c)) ['1bc#', '1b#', '2bc#', '2b#', '3bc#', '3b#'] 

edit:

you can use the product on a bunch of things as you would like also

 >>> list_of_things = [a,b,c] >>> map("".join, product(*list_of_things)) 
+8
source share

try it

 >>> 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#'] 
+12
source share

All Articles