2017-01-14 4 views
-1

私は、すでに(データをソートしていた)Pythonでネストされたリストをグループ化しようとしています。最終的な出力は、カンマがタプル、1行に1つずつ分離する必要がありますネストされたリストをタプルにグループ化する

現在のネストされたリスト:

[['A123', '2012-01-01', 'estrogen'], 
['A123', '2012-01-01', 'ibuprofen '], 
['A123', '2014-01-01', 'oxaliplatin'], 
['A123', '2014-01-01', 'penicilin']] 

望ましい結果(カンマ区切りのタプル)私は、ソートを理解ではなく、かなりの操作を行い

[(('A123', '2012-01-01', 'estrogen'), 
    ('A123', '2012-01-01', 'ibuprofen ')), 
(('A123', '2014-01-01', 'oxaliplatin'), 
    ('A123', '2014-01-01', 'penicilin'))] 

リストを1つにまとめてグループ化する方法を理解する。私が仮定する最後のステップは、タプルに変換することです。あなたはすでにあなたのデータをソートするので

+1

コンマ区切りのタプルはありません。行ごとに1つであるかどうかは、印刷方法によって異なります。タプルのリスト、タプルのタプルなどを作成するかどうかを明確にしてください。特に、最初の2つのタプルと最後の2つのタプルがグループ化されている理由は明確ではありません。彼らは日付でグループ分けされていますか? – DyZ

+0

OP質問からの引用:「私はすでにデータをソートしました」だからあなたはその情報を知る必要はありません。 –

答えて

0

、あなたはタプルにリストを変換し、タプルのタプル(夫婦)2 2によって作成することができます。

l = [['A123', '2012-01-01', 'estrogen'],['A123', '2012-01-01', 'ibuprofen'],['A123', '2014-01-01', 'oxaliplatin'], 
['A123', '2014-01-01', 'penicilin']] 

result = [(tuple(l[i]),tuple(l[i+1])) for i in range(0,len(l),2)] 
print(result) 

zipを使用してバリアントとスライスされたサブリスト:

result = [(tuple(u),tuple(v)) for u,v in zip(l[::2],l[1::2])] 

pprintモジュールを使用しない限り、データの印刷方法を制御することはできません。私は50の幅を選んだので

import pprint 
pprint.pprint(result,width = 50) 

、私は1行に1つの要素を取得

[(('A123', '2012-01-01', 'estrogen'), 
    ('A123', '2012-01-01', 'ibuprofen')), 
(('A123', '2014-01-01', 'oxaliplatin'), 
    ('A123', '2014-01-01', 'penicilin'))] 
(水平方向の配置が含まれ、それはデータに依存しますが、それはあなたの質問に記載された正確に出力を提供しているようです)
+0

これは完璧に働いてくれてありがとう! –

+0

大丈夫ですが、2を2またはコード/日付でグループ化しますか?なぜなら、それが後者であれば、もう1つの答えはそれだからです。 –

+0

入れ子リストは既にコードと日付でソートされています。 list.sort(sampledata、key = itemgetter(0,1,2)) 出力は、各ペアがカンマ区切りのタプルとして返される必要があります。 1行に1つ。それが意味をなさないならば。あなたのコードは動作し、それが三つ組または単一である必要があるとすれば調節可能です。 –

0

これはitertools.groupbyためのケースのように見える:

>>> data = [['A123', '2012-01-01', 'estrogen'], 
... ['A123', '2012-01-01', 'ibuprofen '], 
... ['A123', '2014-01-01', 'oxaliplatin'], 
... ['A123', '2014-01-01', 'penicilin']] 
>>> [tuple(grp) for key, grp in itertools.groupby(data, key=lambda x: x[:2])] 
[(['A123', '2012-01-01', 'estrogen'], ['A123', '2012-01-01', 'ibuprofen ']), 
(['A123', '2014-01-01', 'oxaliplatin'], ['A123', '2014-01-01', 'penicilin'])] 

このグループ1組で一緒に同じ最初の2つの要素(key=lambda x: x[:2])を有するすべてのアイテム。このためにはデータをキーでソートする必要がありますが、これはすでに説明したとおりです。

関連する問題