0

Python 2.7.3 を実行している Windows 7 x64 ワークステーションを使用しています。

次のように、アイテム ID の行を含む CSV ファイルがあり、各行はグループ ID に属しています。

GroupID ItemID
a   1
a   2
a   3
b   4
b   5
b   6
c   7
c   8
c   9
etc…    

私がする必要があるのは、次のように、タプルのリストを生成することです。各タプルは、GroupID の文字列と、GroupID に関連付けられた各 ItemID のリストです。

[('a', [1, 2, 3]), ('b', [4, 5, 6]), ('c', [7 , 8, 9])]

これまでのところ、関数またはリストを使用して変換を設定し、GroupID 列の重複を排除してから、2 回目のループで if ステートメントの何らかの比較を行うことを考えてきました。誰かアドバイスをください。ありがとう!

4

2 に答える 2

1

あなたが探しているitertools.groupby()

イテレータから連続するキーとグループを返すイテレータを作成します。キーは、各要素のキー値を計算する関数です。指定されていないか、Noneの場合、キーはデフォルトで恒等関数になり、要素を変更せずに返します。一般に、イテラブルは同じキー関数ですでにソートされている必要があります。

例えば:

import csv
from itertools import groupby
from operator import itemgetter

with open("test.csv") as file:
    reader = csv.reader(file)
    next(reader) #Skip header
    data = groupby(reader, itemgetter(0))
    print([(key, [item for _, item in items]) for key, items in data])

これをと組み合わせてoperator.itemgetter()、行の最初の項目でグループ化し、ネストされたリスト内包表記を使用して必要なデータを抽出します。

それは私たちに与えます:

[('a', ['1', '2', '3']), ('b', ['4', '5', '6']), ('c', ['7', '8', '9'])]

当然、リストが必要でない限り、ここでジェネレータ式を使用して操作を遅延させることをお勧めします。(ここではリスト内包表記を使用して、優れた出力を取得します)。

あなたの例に示されているようにではなく、あなたが言うようにあなたのファイルはコンマで区切られていると私は仮定していることに注意してください。タブで区切られている場合は、を使用csv.reader(file, dialect=csv.excel_tab)して正しく解析します。

于 2013-02-01T01:35:05.010 に答える
0

グループ化キーが連続している場合は、次のようになります。

from itertools import groupby
from operator import itemgetter

data = [('a', 1), ('a', 2), ('b', 3), ('b', 5)]

grouped = [(k, map(itemgetter(1), g)) for k, g in groupby(data, itemgetter(0))]
# [('a', [1, 2]), ('b', [3, 5])]

それ以外の場合は、を使用しcollections.defaultdictます。

于 2013-02-01T01:37:46.800 に答える