在元组列表中进行组合

时间:2019-05-01 14:41:29

标签: python list tuples

我正在研究其他问题。我有以下列表

[(['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 个答案:

答案 0 :(得分:2)

使用列表理解:

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 :(得分:2)

itertools的

产品正在按预期运行。问题在于Python字符串是 iterable ,因此产品正在迭代字符串的元素。如果要将字符串视为单个元素,可以将其放入列表中并将该列表提供给产品

答案 2 :(得分:1)

您可以使用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')]

答案 3 :(得分:0)

您可以使用列表推导:

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)