2012-10-15 200 views
0

,我有以下数据:通过列表迭代的值追加到变量列表

data = [['AB', 'BS, BT'], ['AH', 'AH'], ['AS', 'AS, GS']] 

我想通过列表的列表迭代产生一个元组列表。

new_data = [('AB', 'BS'), ('AB', 'BT'), ('AH', 'AH'), ('AS', 'AS') ('AS', 'GS')] 

我正在考虑使用zip()函数,但不知道我是否使用了正确的逻辑。

回答

2

zip不会是我的第一选择。我的第一个选择是itertools.productitertools.chain

In [103]: data = [['AB', 'BS, BT'], ['AH', 'AH'], ['AS', 'AS, GS']] 

In [104]: [list(itertools.product([d[0]], d[1].split(','))) for d in data] 
Out[104]: [[('AB', 'BS'), ('AB', ' BT')], [('AH', 'AH')], [('AS', 'AS'), ('AS', ' GS')]] 

In [105]: list(itertools.chain.from_iterable([list(itertools.product([d[0]], d[1].split(','))) for d in data])) 
Out[105]: [('AB', 'BS'), ('AB', ' BT'), ('AH', 'AH'), ('AS', 'AS'), ('AS', ' GS')] 

希望这有助于

+0

''itertools.product''是这样,+1的一个很好的方式。值得注意的是,在正常使用情况下,您不需要额外的“list()”调用。 –

+0

我完全可以看到内部呼叫是多余的。但是不需要外部'list'调用吗? – inspectorG4dget

+1

如果列表是严格需要的,是的,但迭代器完成这项工作的时间有99%。 –

1

这可以用itertools.repeat()很容易地完成。我们用这个来重复每个其他项目的第一个项目,我们通过分割","然后拉紧来生成我们的元组。然后我们使用itertools.chain.from_iterable()来生成一个列表。

>>> import itertools 
>>> data = [['AB', 'BS, BT'], ['AH', 'AH'], ['AS', 'AS, GS']] 
>>> for item in itertools.chain.from_iterable(zip(itertools.repeat(first), second.split(",")) for first, second in data): 
...  print(item) 
... 
('AB', 'BS') 
('AB', ' BT') 
('AH', 'AH') 
('AS', 'AS') 
('AS', ' GS') 
0

使用zip()

In [32]: data 
Out[32]: [['AB', 'BS, BT'], ['AH', 'AH'], ['AS', 'AS, GS']] 

In [33]: [zip([x[0]]*len(x[1].split(",")),x[1].split(",")) for x in data] 
Out[33]: [[('AB', 'BS'), ('AB', ' BT')], [('AH', 'AH')], [('AS', 'AS'), ('AS', ' GS')]] 

使用chain()得到预期的输出:

In [34]: lis=[zip([x[0]]*len(x[1].split(",")),x[1].split(",")) for x in data] 

In [35]: list(chain(*lis)) 
Out[35]: [('AB', 'BS'), ('AB', ' BT'), ('AH', 'AH'), ('AS', 'AS'), ('AS', ' GS')] 

使用izip_longest,与fillvalue等于每个子列表的第一个元素:

In [47]: from itertools import chain,izip_longest 

In [48]: lis=[tuple(izip_longest([x[0]],x[1].split(","),fillvalue=x[0])) for x in data] 

In [49]: lis 
Out[49]: [(('AB', 'BS'), ('AB', ' BT')), (('AH', 'AH'),), (('AS', 'AS'), ('AS', ' GS'))] 

In [50]: list(chain(*lis)) 
Out[50]: [('AB', 'BS'), ('AB', ' BT'), ('AH', 'AH'), ('AS', 'AS'), ('AS', ' GS')]