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

[(['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')]]
0
PIG 1 Май 2019 в 17:41

4 ответа

Лучший ответ

Вы можете использовать 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')]
1
benvc 1 Май 2019 в 14:57

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

2
TCFP 1 Май 2019 в 14:52

Используйте понимание списка:

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))
2
kantal 1 Май 2019 в 14:47

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

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)
0
Alec Alameddine 1 Май 2019 в 14:55