2016-11-29 2 views
0

私はコレクションモジュールからsetdefault()関数を使って2つのテーブル/ディクテーションを作成しています。最初のdictは、最初のitem要素がキーになり、2番目の要素が値になるように圧縮され、キーごとに任意の数の値が存在できる2つのリストから作成されます。各キーの重複値を除外する方法はありますか?setdefaultsで一意の値を保持するだけです

keylst = ['a','a','b','b','a','b'] 
vallst = [1,1,2,2,3,3] 

zip = [('a',1),('a',1),('b',2),('b',2),('a',3),('b',3)] 
result = a[1,1,3], b[2,2,3] 

desired_result = a[1,3], b[2,3] 

はここで、これまでに私のコードです:

import collections 
import xlrd 

#open workbook to get values 
wb1 = xlrd.open_workbook(r"S:\Bands.xlsx") 
sh1 = wb1.sheet_by_index(0) 

#Open a rate code workbook 
wb2 = xlrd.open_workbook(r"S:\Sands.xlsx") 
sh2 = wb2.sheet_by_index(0) 

#make a lists 

roLst = [] 
raLst = [] 

# polpulate lists 

cell_range_value = 0 
for value in sh1.col(9): 
    cell_range_value += 1 
print cell_range_value 

for i in range(1,cell_range_value,1): 
    roVal = str(sh1.cell(i,9).value) 
    raVal = str(sh1.cell(i,19).value) 
    cell_value_id = sh1.cell(i,1).value 
    roLst.append(roVal) 
    raLst.append(raVal) 

#make multivalue dict1 
RoRaDct = {} 

for key, item in zip(roLst,raLst): 
    RoRaDct.setdefault(key,[]).append(item) 

for key, item in RoRaDct.items(): 
    print key, item 

#make multivalue dict2 

fType = [] 
rtLst2 = [] 

cell_range_value = 0 
for value in sh2.col(0): 
    cell_range_value += 1 

for i in range(1,cell_range_value,1): 
    fVal = str(sh2.cell(i,1).value) 
    rtVal = str(sh2.cell(i,0).value) 
    cell_value_id = sh2.cell(i,1).value 
    fType.append(fVal) 
    rtLst2.append(rtVal) 

TpRtDct = {} 

#check values 

for key, item in zip(fType,rtLst2): 
    TpRtDct.setdefault(key,[]).append(item) 

for key, item in TpRtDct.items(): 
    print key, item 
+1

'list'値が必要ですか?代わりに' set'を使ってコードを動作させることはできますか? – mgilson

+0

セットは問題ありません。私は、彼らが作成された後にディクテーションをループし、その値をセットにすることができると思います。 – ShaunO

+0

はい。それは完璧に働いた。 – ShaunO

答えて

1

あなたは順序を気にしない場合は、その後に注意してください、またsetdefault

TpRtDct.setdefault(key,set()).add(item) 

を変更することができますdefaultdictを追加すると、書き込みがより読みやすいとみなされます。

RoRaDct = defaultdict(set) 

for key, item in zip(roLst,raLst): 
    RoRaDct[key].add(item) 
+0

私はちょうどそのように作成した後にdictをループしました:for key、RoRaDct.items()の項目: item = set(item)。 defaultdict()はより効率的ですか? – ShaunO

+0

その後にもう一度印刷してください。これは、辞書の項目を変更することはありません。あなたはコピーを繰り返しています。 –

+0

私はdefaultdictがより効率的で、もっと読みやすく、それが推奨される方法だとは思わない。 –

0

の順序を保持するOrderedSetオブジェクトの辞書を作成して、一度に追加できる場所が一意の値であることが保証できるのが理想的です。

残念ながら、Pythonにはそのようなクラスは組み込まれていませんが、代わりにOrderedDictを使用できます。一意性のメンバシップチェックがlistを使用して値を収集するのに使用された場合よりも速くなることが、set(またはdict)を使用する利点はより速くなります。ここで

は私の意味は次のとおりです。

from collections import OrderedDict 

keylst = ['a','a','b','b','a','b'] 
vallst = [1,1,2,2,3,3] 

result = {} 
for k,v in zip(keylst, vallst): 
    result.setdefault(k, OrderedDict())[v] = 1 

# convert final values in result dictionary into lists 
for key, value in result.items(): 
    result[key] = list(value.keys()) # In Python 2.x, just use = values.keys() 

print(result) # -> {'a': [1, 3], 'b': [2, 3]} 

P.S. Raymond HettingerのOrderedSetrecipeは、上のコードのようにOrderedDictでシミュレートする代わりに使用できます。

関連する問題