次のような辞書があります。
{100002: "['Apple', 'M', 'R', '500001', 'Fruit', '90']", 100004: "['Banana', 'M', 'Y', '500001', 'Fruit', '75']"}
キーは整数で、値は文字列です。
次のような .csv ファイルがあります。
100001,1
100001,1
100001,2
100002,1
100002,1
100002,3
100002,3
100003,1
100003,4
100004,2
100004,3
100004,3
特定のキーの 2 列目の各数値の出現回数をカウントし、そのカウントを dict に追加したいと考えています。したがって、このサンプルでは、100001 は 1 の場合は 2、2 の場合は 1、100002 の場合は 1 の場合は 2、3 の場合は 2、100003 の場合は 1 の場合は 1、4 の場合は 1、100004 の場合は2 の場合は 1、3 の場合は 2 のカウントです。この .csv ファイルには広範囲のキーのデータがありますが (私の dict のキーはサブセットです)、これらのカウントを dict に追加して、見えるようにしたいと思います。このように (キーごとに 4 つの新しい値が追加され、数字 1 ~ 4 のカウントごとに 1 つずつ順番に追加されます)。
{100002: "['Apple', 'M', 'R', '500001', 'Fruit', '90', '2', '0', '2', '0']", 100004: "['Banana', 'M', 'Y', '500001', 'Fruit', '75', '0', '1', '2', '0']"}
これらの 4 つの追加された部分は、番号 1 ~ 4 のカウントであるため、100002 は'2', '0', '2', '0'
.csv ファイルに100002,1
0 行が100002,2
2行あり、0 行100002,3
が2 行あるため100002,4
です。
私の質問には 2 つの部分があります。1) .csv ファイルでキーの後に 1 ~ 4 の数字が続く回数をカウントアップするにはどうすればよいですか? 2) これらのカウントを辞書に追加するにはどうすればよいですか?
答え:
受け入れられた回答に基づいて、これを作成しました。思ったよりも少し醜いですが、なんとか仕事を終わらせることができました。
dd = defaultdict(lambda: defaultdict(int))
with open('AgentsCorpLevel.csv') as fin:
csvin = csv.reader(fin)
for row in csvin:
if int(row[0]) in MyDict.keys():
dd[int(row[0])][row[1]] += 1
print dd
dicts = MyDict,dd
#print dicts
FullDict = {}
PartlyCleanedDict = {}
CleanedDict = {}
TwoTypeDict = {k:[d.get(k) for d in dicts] for k in {k for d in dicts for k in d}}
for key, value in TwoTypeDict.iteritems():
FullDict.setdefault((int(key)), str(value))
for key, value in FullDict.iteritems():
PartlyCleanedDict.setdefault((int(key)), value.translate(None, "[]{()\/\'\"<>").replace('}',',}'))
for key, value in PartlyCleanedDict.iteritems():
CleanedDict.setdefault((int(key)), value.replace(',defaultdicttype int', ''))
print CleanedDict
のprint
はdd
こんな感じ
defaultdict(<function <lambda> at 0x00000000025C3518>, {1000164: defaultdict(<ty
pe 'int'>, {'1': 12, '3': 5, '2': 17, '4': 10}), 1000103: defaultdict(<type 'int
'>, {'1': 3, '3': 3, '2': 3, '4': 3}), 1000137: defaultdict(<type 'int'>, {'1':
5, '3': 4, '2': 7, '4': 1}), 1000140: defaultdict(<type 'int'>, {'1': 28, '3': 2
6, '2': 33, '4': 8}), 1000143: defaultdict(<type 'int'>, {'1': 1, '3': 3, '2': 1
, '4': 1}), 1000149: defaultdict(<type 'int'>, {'1': 6, '3': 7, '2': 9, '4': 6})
, 1000150: defaultdict(<type 'int'>, {'1': 13, '3': 11, '2': 22, '4': 12}), 1000
132: defaultdict(<type 'int'>, {'1': 2, '3': 4, '2': 4, '4': 1}), 1000155: defau
ltdict(<type 'int'>, {'1': 10, '3': 4, '2': 2, '4': 3}), 1000158: defaultdict(<t
ype 'int'>, {'1': 6, '3': 1, '2': 7, '4': 5})})
残念ながら、結果の CleanedDict を完全に「きれいにする」試みはうまくいきませんでしたprint
。サンプルで行っていた野菜のテーマ。
{1000132: 'Kiwi, S, B, 500006, Fruit, 3n, defaultdicttype int, 1: 2, 3: 4, 2: 4, 4: 1,}', 1000103: 'Iceberg Lettuce, M, G, 500004, Vegetable, 2n, defaultdicttype int, 1: 3, 3: 3, 2: 3, 4: 3,}',1000137: 'Pineapple, M, Y, 500006, Fruit, 45n,defaultdicttype int, 1: 5, 3: 4, 2: 7, 4: 1,}'}