2016-01-05 4 views
3

Я буду пытаться объяснить это на примере, так как я, кажется, есть проблема, объясняющую его к себе:хочет объединить все элементы списка с каждым элементом п перечисляет

вообразить меня есть список строк, и другой список списков строк:

words = ["hello", "goodbye", "foo"] 
lists = [["111", "450", "nice"], ["can", "be", "of", "different", "sizes"]] 

Я хочу объединить 1 элемент первого списка только один пункт из п списков в списках, например:

при п = 1:

hello111 
hello450 
hellonice 
hellocan 
hellobe 
... 

или п = 2

hello111can 
hello111be 
hello111of 
... 

п = 3 не было бы возможно в этом случае я пытаюсь это в Python с использованием itertools продукта или что-то, но я не могу показаться, чтобы обернуть вокруг моей головы как это сделать

[EDIT] Ответ, который я назвал правильным, это то, что я хочу, но с перестановками вместо комбинаций, спасибо TON!

+0

Я думаю, что я понимаю пример для 'n == 1', но я не понимаю, как должен работать случай' n == 2'. – timgeb

+1

В общем случае, пожалуйста, приведи пример для n = 2 и трех подписок! –

+0

Ибо когда n = 2, вы хотите как hello111can, так и hellocan111, или просто первый? – FCo

ответ

1
from itertools import combinations, product 

words = ["hello", "goodbye", "foo"] 
lists = [["111", "450", "nice"], ["can", "be", "of", "different", "sizes"]] 

# how many elements of `lists` to pick from? 
for n in range(1, len(lists) + 1): 
    # This returns in-order combinations, ie you will get 
    # '111', 'can' and not 'can', '111'. 
    # If you want all orderings as well as all combinations, 
    # use itertools.permutations instead, 
    for sublist in combinations(lists, n): 
     # now we generate all combinations of 
     # one element from each basis list, 
     basis = [words] + list(sublist) 
     for combo in product(*basis): 
      # and display the result 
      print("".join(combo)) 

который дает

hello111 
hello450 
hellonice 
goodbye111 
goodbye450 
goodbyenice 
foo111 
foo450 
foonice 
hellocan 
hellobe 
helloof 
hellodifferent 
hellosizes 
goodbyecan 
goodbyebe 
goodbyeof 
goodbyedifferent 
goodbyesizes 
foocan 
foobe 
fooof 
foodifferent 
foosizes 
hello111can 
hello111be 
hello111of 
hello111different 
hello111sizes 
hello450can 
hello450be 
hello450of 
hello450different 
hello450sizes 
hellonicecan 
hellonicebe 
helloniceof 
hellonicedifferent 
hellonicesizes 
goodbye111can 
goodbye111be 
goodbye111of 
goodbye111different 
goodbye111sizes 
goodbye450can 
goodbye450be 
goodbye450of 
goodbye450different 
goodbye450sizes 
goodbyenicecan 
goodbyenicebe 
goodbyeniceof 
goodbyenicedifferent 
goodbyenicesizes 
foo111can 
foo111be 
foo111of 
foo111different 
foo111sizes 
foo450can 
foo450be 
foo450of 
foo450different 
foo450sizes 
foonicecan 
foonicebe 
fooniceof 
foonicedifferent 
foonicesizes 

, который производит все п = 1, прежде чем п = 2, N = 3, и т.д. Если вы не заботиться о упорядоченности, вы могли бы вместо того, чтобы сделать

for word in words: 
    combos = product(*([""] + sublist for sublist in lists)) 
    next(combos) # skip n=0 
    for combo in combos: 
     print(word + "".join(combo)) 

который производит

hellocan 
hellobe 
helloof 
hellodifferent 
hellosizes 
hello111 
hello111can 
hello111be 
hello111of 
hello111different 
hello111sizes 
hello450 
hello450can 
hello450be 
hello450of 
hello450different 
hello450sizes 
hellonice 
hellonicecan 
hellonicebe 
helloniceof 
hellonicedifferent 
hellonicesizes 
goodbyecan 
goodbyebe 
goodbyeof 
goodbyedifferent 
goodbyesizes 
goodbye111 
goodbye111can 
goodbye111be 
goodbye111of 
goodbye111different 
goodbye111sizes 
goodbye450 
goodbye450can 
goodbye450be 
goodbye450of 
goodbye450different 
goodbye450sizes 
goodbyenice 
goodbyenicecan 
goodbyenicebe 
goodbyeniceof 
goodbyenicedifferent 
goodbyenicesizes 
foocan 
foobe 
fooof 
foodifferent 
foosizes 
foo111 
foo111can 
foo111be 
foo111of 
foo111different 
foo111sizes 
foo450 
foo450can 
foo450be 
foo450of 
foo450different 
foo450sizes 
foonice 
foonicecan 
foonicebe 
fooniceof 
foonicedifferent 
foonicesizes 

(такой же список, другой заказ).

+0

Вы не можете использовать выход за пределами функции – heinst

+0

Приятный человек;) именно то, что мне нужно, но с перестановками, как вы уже упоминали! Как вы, ребята, обнимаете голову, черт! действительно хорошая работа, СПАСИБО – Esser420

1

Во-первых, получить комбинации n элементов из lists с помощью itertools.combinations(lists, n), а затем получить продукт из исходных слов и элементы из этой комбинации, используя itertools.product(words, *comb). Вы можете объединить оба шага в один двойной цикл списка понимания:

>>> n = 1 
>>> [x for comb in itertools.combinations(lists, n) for x in itertools.product(words, *comb)] 
[('hello', '111'), 
('hello', '450'), 
('hello', 'nice'), 
('goodbye', '111'), 
... 
('foo', 'sizes')] 

Или n = 2:

[('hello', '111', 'can'), 
('hello', '111', 'be'), 
('hello', '111', 'of'), 
('hello', '111', 'different'), 
('hello', '111', 'sizes'), 
('hello', '450', 'can'), 
... 
('foo', 'nice', 'sizes')] 

И n = 3 и выше вы получаете [].

И, наконец, только ''.join тех, кто вместе. (Я не сделал, так что это более читаемым.)

>>> [''.join(x) for comb in itertools.combinations(lists, n) for x in itertools.product(words, *comb)] 
+0

Ему нужен список строк. 'x' следует заменить на' "".join (x) ', чтобы дать то, что хочет OP – heinst

+0

@heinst Да, это именно то, что я сказал в моей последней строке. Я думал, что списки сделают комбинации более явными. –

+0

Ах не видел! Сожалею! – heinst

 Смежные вопросы

  • Нет связанных вопросов^_^