0

次のデータがあります。

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

リストのリストを繰り返し処理して、タプルのリストを生成したいと思います。

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

zip() 関数を使用することを考えていましたが、正しいロジックを使用しているかどうか確信が持てませんでした。

4

3 に答える 3

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')]

お役に立てれば

于 2012-10-15T19:52:28.597 に答える
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')
于 2012-10-15T19:38:41.903 に答える
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_longestfillvalue各サブリストの最初の要素に等しい:

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')]
于 2012-10-15T19:39:52.093 に答える