2016-07-01 17 views
-2

私はPythonで大きなCSVファイルを扱っていますが、ユニークな識別子に関連付けられたテキストのリストに基づいて辞書を作成しようとしています。 CSVでは、Items列の各セルの値は元々フリーテキストであり、カンマで区切られたリストになりました。データは次のようになります。私は、アイテム欄の各要素の一意の識別子の数を取得しようとしているリストアイテムをPython辞書のキーとして使用する

ID  Items 
123  'A', 'B', 'C' 
234  'A', 'C', 'D' 
567  'A', 'D', 'E', 'F' 

(すなわち、多くのユニークなIDがAを持ってどのように、どのように多くのBを持っています)。アイテムをキーとして辞書を作成する方法はありますか?このように:

{'A': 123, 234, 567 'B': 123 'C': 123, 234 'D': 234, 567}

私は、forループを使用しようとしています。まず、私が使用したいcsvの列を特定します。項目(10)。次に、リストの各要素をループしたいと思います。

dict = {}   
reader = csv.reader(inF) 
for row in reader: 
    items = row[10] 
     for x in items: 
      if x not in dict: 
        dict[x] += x 
+3

確かに、それは非常に可能です。 –

+1

あなたが試したこととそれがうまくいかなかったことを私たちに教えてください。これには複数の方法があります。 – Jeff

+0

不完全で間違っているコードをいくつか追加しました...ここからどこに行くのか分かりません。ありがとう! – user6535959

答えて

0

与えられたファイル形式に基づいて、これは動作します。しかし、どのような辺の場合に応じて、正規表現を変更する必要があります。私はcsvリーダーを使用しませんでした。このケースでは、正規表現は簡単ではないように思われたからです。

# import regular expressions 
import re 

itemLookup = dict() 
file = 'data.csv' 
with open(file, 'r') as f: 
    for line in f: 
     # split rows on either ', ' or ' ' 
     columns = re.split(',? +', line) 

     # only process row if it starts with a number 
     id_mo = re.search('^\d+$', columns[0]) 
     if id_mo: 
      # get the id number (first column) 
      # and convert it from a string to an integer 
      id = int(id_mo.group(0)) 

      # for the rest of the columns in this row 
      for col in columns[1:]: 
       # search for the get item name in the column 
       # (without quotes or new lines) 
       # i.e. i'm assuming item name matches this regex 
       item_mo = re.search('\w+', col) 

       # ignore empty columns 
       if item_mo: 
        # get the item name that we just searched for 
        item = item_mo.group(0) 

        # if we have not come across this item name before 
        if item not in itemLookup: 
         # then create it, and assign it an empty list 
         itemLookup[item] = [] 
        # add the id to the list referenced by the item name 
        itemLookup[item].append(id) 

print(itemLookup) 

出力:

{ 'A': [123, 234, 567], 
    'C': [123, 234], 
    'B': [123], 
    'E': [567], 
    'D': [234, 567], 
    'F': [567] 
} 
+0

ありがとう!これは非常に役に立ちます! – user6535959

関連する問題