我正在使用collections模块中的setdefault()函数创建两个表/ dicts。第一个dict是从两个压缩列表创建的,其中第一个item元素成为键,第二个元素成为值,这样每个键可以有任意数量的值。有没有办法排除每个键的重复值?
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
答案 0 :(得分:1)
如果您不关心订单,可以将setdefault
更改为
TpRtDct.setdefault(key,set()).add(item)
另外,请记住,在添加defaultdict
之后,它被认为更具可读性
RoRaDct = defaultdict(set)
for key, item in zip(roLst,raLst):
RoRaDct[key].add(item)
答案 1 :(得分:0)
理想情况下,如果您可以创建一个OrderedSet
对象字典来保存订单并且保证只有同时添加到它的唯一值,那就太好了。< / p>
不幸的是,Python内置了这样的类,但你可以在它的位置使用OrderedDict
。使用set
(或dict
)成员检查唯一性的优势将比使用简单list
来收集值更快。
这就是我的意思:
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撰写的OrderedSet
recipe,您可以使用OrderedDict
来模拟上面代码中的myStoryboard
。