从范围的字典中检索结果

时间:2013-04-10 20:26:38

标签: python list dictionary python-2.7

我有一个ENTIREMAP,其中包含所有名称和玩具价格的映射。我想要尝试做的是创建一个函数getResults,如下所示:

#################
def getResults(name, price):
# where name could be 'Laura' and price is 0.02
# then from the ENTIREMAP find the key 'Laura' and if 0.02 is in the range
# of the prices in the map i.e since 0.02 is between (0.0,0.05) then return
# ('PEN', 'BLUE')

   prices =  [d[name] for d in ENTIRELIST if name in d]
   if prices:
       print prices[0]

###################

GIRLTOYPRICES = {(0.0,0.05):('PEN', 'BLUE'), 
             (0.05,0.08):('GLASSES', 'DESIGNER'), 
             (0.08,0.12):('TOP', 'STRIPY'), 
            }

BOYTOYPRICES = {(0.0,0.10):('BOOK', 'HARRY POTTER'), 
             (0.10,0.15):('BLANKET', 'SOFT'), 
             (0.15,0.40):('GBA', 'GAMES'), 
            }

GIRLS = ['Laura', 'Samantha']
BOYS = ['Mike','Fred']

GIRLLIST = [{girl: GIRLTOYPRICES} for girl in GIRLS]
BOYLIST = [{boy: BOYTOYPRICES} for boy in BOYS]

ENTIRELIST = GIRLMAP + BOYMAP 

print ENTIRELIST

[{'Laura': {(0.0, 0.05): ('PEN', 'BLUE'), (0.08, 0.12): ('TOP', 'STRIPY'), (0.05, 0.08): ('GLASSES', 'DESIGNER')}}, {'Samantha': {(0.0, 0.05): ('PEN', 'BLUE'), (0.08, 0.12): ('TOP', 'STRIPY'), (0.05, 0.08): ('GLASSES', 'DESIGNER')}}, {'Mike': {(0.0, 0.1): ('BOOK', 'HARRY POTTER'), (0.15, 0.4): ('GBA', 'GAMES'), (0.1, 0.15): ('BLANKET', 'SOFT')}}, {'Fred': {(0.0, 0.1): ('BOOK', 'HARRY POTTER'), (0.15, 0.4): ('GBA', 'GAMES'), (0.1, 0.15): ('BLANKET', 'SOFT')}}]

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

一种奇怪的数据结构,但是:

for person in ENTIRELIST:
    person_name, toys = person.items()[0]
    if person_name != name:                # inverted to reduce nesting
        continue

    for (price_min, price_max), toy in toys.items():
        if price_min <= price < price_max:
            return toy

这更简单(也更有效):

GIRLMAP = {girl: GIRLTOYPRICES for girl in GIRLS}
BOYMAP = {boy: BOYTOYPRICES for boy in BOYS}

ENTIREMAP = dict(GIRLMAP, **BOYMAP)

for (price_min, price_max), toy in ENTIREMAP[name].items():
    if price_min <= price < price_max:
        return toy