Составьте комбинацию из списка кортежей - PullRequest
0 голосов
/ 01 мая 2019

Я работал над другим вопросом. У меня есть список ниже

[(['1', '2', '3'], 'abc'), (['4', '5', '6'], 'xyz')]

Вывод должен быть ниже

[('1', 'abc'), ('2', 'abc'), ('3', 'abc'), ('4', 'xyz'), ('5', 'xyz'), ('6', 'xyz')]

Моя попытка Сначала я раскрываю список внутри него

l1=[ tuple(i[0])+(i[1],) for i in l ]
print (l1)
[('1', '2', '3', 'abc'), ('4', '5', '6', 'xyz')]

Тогда попробовал продукт от itertools, но он не дает мне требуемого результата. Проблема в том, что «abc» разбивается на «a», «b», «c» с использованием продукта.

from itertools import product
[ list(product(i[:-1],i[-1])) for i in l1 ]

[[('1', 'a'),
  ('1', 'b'),
  ('1', 'c'),
  ('2', 'a'),
  ('2', 'b'),
  ('2', 'c'),
  ('3', 'a'),
  ('3', 'b'),
  ('3', 'c')],
 [('4', 'x'),
  ('4', 'y'),
  ('4', 'z'),
  ('5', 'x'),
  ('5', 'y'),
  ('5', 'z'),
  ('6', 'x'),
  ('6', 'y'),
  ('6', 'z')]]

Ответы [ 4 ]

2 голосов
/ 01 мая 2019

продукт от itertools работает по назначению.Проблема в том, что строки Python повторяемы , поэтому product выполняет итерацию по элементам строки.Если вы хотите обработать строку как отдельный элемент, вы можете поместить ее в список и передать список продукту

2 голосов
/ 01 мая 2019

Использование списка понимания:

L=[(['1', '2', '3'], 'abc'), (['4', '5', '6'], 'xyz')]                                                                

In: [ (n,s) for l,s in L for n in l ]                                                                                     
Out: 
[('1', 'abc'),
 ('2', 'abc'),
 ('3', 'abc'),
 ('4', 'xyz'),
 ('5', 'xyz'),
 ('6', 'xyz')]

Как можно написать:

rslt=[]
for l,s in L:
   for n in l:
     rslt.append((n,s))
1 голос
/ 01 мая 2019

Вы можете использовать itertools.product, пока вы оборачиваете строку в итерируемое, так что она обрабатывается как отдельный элемент итерируемого, а не итерированного.

from itertools import product

data = [(['1', '2', '3'], 'abc'), (['4', '5', '6'], 'xyz')]

combos = [combo for a, b in data for combo in product(a, [b])]
print(combos)
# [('1', 'abc'), ('2', 'abc'), ('3', 'abc'), ('4', 'xyz'), ('5', 'xyz'), ('6', 'xyz')]
0 голосов
/ 01 мая 2019

Вы можете использовать списки:

ls = [(['1', '2', '3'], 'abc'), (['4', '5', '6'], 'xyz')]
ls_new = [(a,b) for n,b in ls for a in n]
print(ls_new)
...