仅在setdefaults dict中保留唯一值

时间:2016-11-29 18:59:02

标签: python collections

我正在使用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

2 个答案:

答案 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