2016-10-15 2 views
-2

ここにpythonが新しくなりました。 重複した辞書キーを削除して重複を見つけた場合は、加算/減算などの算術演算を行うだけで、重複した辞書キーを排除したいと考えています。私が欲しいもの辞書は、減算と値の加算と共に重複を削除します。

現在のコード出力

{('GRILLED AUSTRALIA ANGU',): (('1',), ('29.00',)), ('Beer', 'Carrot Cake', 'Chocolate Cake'): (('10', '1', '1'), ('30.00', '2.50', '3.50')), ('Beer', 'Beer'): (('1', '1'), ('3.00', '3.00')), ('Carrot Cake', 'Chocolate Cake'): (('1', '1'), ('2.50', '3.50')), ('Carrot Cake',): (('1',), ('2.50',)), ('BRAISED BEANCURD WITH',): (('1',), ('10.00',)), ('SAUSAGE WRAPPED WITH B', 'ESCARGOT WITH GARLIC H', 'PAN SEARED FOIE GRAS', 'SAUTE FIELD MUSHROOM W', 'CRISPY CHICKEN WINGS', 'ONION RINGS'): (('1', '1', '1', '1', '1', '1'), ('10.00', '12.00', '15.00', '9.00', '7.00', '6.00')), ('Beer', 'Beer', 'Carrot Cake', 'Chocolate Cake'): (('-1', '10', '1', '1'), ('-3.00', '30.00', '2.50', '3.50')), ('Beer',): (('10',), ('30.00',))}

:例:DUPLICATE

{'Beer': [9, 27]} , {'carrot cake': [1, 2.5]} , {'Chocolate Cake': [1, 3.5]}

重複する項目入力のために、私は一緒に一つにビールをトリミングすることを予告FOR

減算(10-1 = 9)、コストは(30-3 = 27)となります。どのように私はこのプロセスを自動化するのですか? Iは、数量(1 + 1)とコスト(3 + 3 = 6)

を有する1つのエントリにと一緒にビール、ビールを追加DUPLICATE

{'Beer': [2, 6]}

通知を

ADDITION私のコード:

import csv 
from itertools import groupby 
from operator import itemgetter 
import re 

d = {} 

#open directory and saving directory 
with open("rofl.csv", "rb") as f, open("out.csv", "wb") as out: 
    reader = csv.reader(f) 
    next(reader) 
    writer = csv.writer(out) 
    #the first column header 
    writer.writerow(["item","quantity","amount"]) 
    groups = groupby(csv.reader(f), key=itemgetter(0)) 


    for k, v in groups: 
     v = list(v) 


     sales= [ x[1] for x in v[8:] ] 
     salesstring= str(sales) 

     #using re.findall instead of re.search to return all via regex for items 
     itemoutput= re.findall(r"(?<=\s\s)\w+(?:\s\w+)*(?=\s\s)",textwordfortransaction) 

     #using re.findall instead of re.search to return all via regex for amount aka quantity 
     amountoutput= re.findall(r"'(-?\d+)\s+(?:[A-Za-z ]*)",textwordfortransaction) 

     #using re.findall instead of re.search to return all via regex for cost 

     costoutput= re.findall(r"(?:'-?\d+[A-Za-z ]*)(-?\d+[.]?\d*)",textwordfortransaction) 

     d[tuple(itemoutput)] = tuple(amountoutput),tuple(costoutput) 


     #writing the DATA to output CSV 
     writer.writerow([d]) 
     #to remove the last entry else it would keep on stacking the previous 
     d.clear() 

リンクcsvファイルへ を必要に応じて質問に投稿されたとして、あなたの現在の出力を使用した作業

+0

更新されたコードのplsはちょうど明確化のため – Perlinn

+0

をリフレッシュ:それはそうですあなたはいつも値を加えたいと思っていますが、値のいくつかはちょうど負の値になりますよね? –

+0

2種類の複製が存在します。最初の複製は正の値を持つので、単純にそれらを1つにまとめます。 2番目の値は負の値ですが、1つのキーにダンプしてトリムするだけで、現在の出力セクションが更新されます – Perlinn

答えて

2

、あなたはアイテムと数量と価格のタプルのちょうどzip異なるリストは、お互いにアイテムを揃える2 defaultdictsでそれらを追加し、最終的にはそれらを結合することができますその結果に。その後

output = {('GRILLED AUSTRALIA ANGU',): (('1',), ('29.00',)), ...} 

from collections import defaultdict 
prices, quantities = defaultdict(int), defaultdict(int) 
for key, val in output.items(): 
    for item, quant, price in zip(key, *val): 
     quantities[item] += int(quant) 
     prices[item] += float(price) 

result = {item: (quantities[item], prices[item]) for item in prices} 

resultはこれです:あなたがいないは、数量および/または価格が負の場合、重複を減算するための特別なケースを必要ないことに注意してください。ちょうど負の数を追加してください。

{'ESCARGOT WITH GARLIC H': (1, 12.0), 
'BRAISED BEANCURD WITH': (1, 10.0), 
'CRISPY CHICKEN WINGS': (1, 7.0), 
'SAUSAGE WRAPPED WITH B': (1, 10.0), 
'ONION RINGS': (1, 6.0), 
'PAN SEARED FOIE GRAS': (1, 15.0), 
'Beer': (31, 93.0), 
'Chocolate Cake': (3, 10.5), 
'SAUTE FIELD MUSHROOM W': (1, 9.0), 
'Carrot Cake': (4, 10.0), 
'GRILLED AUSTRALIA ANGU': (1, 29.0)} 

あなたは、分離した個々の項目を保つだけでpricesの宣言を移動、quantities、そしてresult内側、外側のループにしたい場合:

for key, val in output.items(): 
    prices, quantities = defaultdict(int), defaultdict(int) 
    for item, quant, price in zip(key, *val): 
     quantities[item] += int(quant) 
     prices[item] += float(price) 
    result = {item: (quantities[item], prices[item]) for item in prices} 
    # do something with result or collect in a list 

例2のためになります - ビアライン:

('Beer', 'Beer', 'Carrot Cake', 'Chocolate Cake') (('-1', '10', '1', '1'), ('-3.00', '30.00', '2.50', '3.50')) 
{'Chocolate Cake': (1, 3.5), 'Beer': (9, 27.0), 'Carrot Cake': (1, 2.5)} 
一緒

あなたがグループにresultを希望する場合の項目、数量と価格、これを使用する:

items = list(prices) 
result = (items, [quantities[x] for x in items], [prices[x] for x in items]) 

結果は次のようにこのです:

(['Carrot Cake', 'Beer', 'Chocolate Cake'], [1, 9, 1], [2.5, 27.0, 3.5]) 
+0

nice!私はそれらを個別に呼び出すにはどうすればいいですか?最終的に私はそれをCSVファイルに出力したいと思います。writer.writerow([d]) – Perlinn

+0

を使用して、{item ':(1,5)}に基づいて数量と価格をセクション化して出力します。ケーキ... | 2、2 | 13、2 | – Perlinn

+0

画像の例:https://drive.google.com/open?id=0B1kSBxOGO4uJSlJzYm83OER1MzA – Perlinn

関連する問題