字典列表中具有最小值的元组

时间:2015-09-09 02:19:18

标签: python list dictionary tuples min

好的所以我正在尝试编写一个函数,它将字典作为参数并返回一个元组列表,第一个项目作为键,第二个值作为最低值项目。此外,如果字典的值为空,则元组在该位置应该为False。 它应该如何运作的例子:

>>> storeDict = {"socks" : [6.99, 4.50, 5.00, 4.99], "shoes" : [14.99,19.99], 
"napkin" : [],"shirt" : [8.99, 7.00, 6.50, 10.25, 8.99]}
>>> LowestPrice(storeDict)
[('shoes', 14.99), ('napkin', False), ('shirt', 6.5), ('socks', 4.5)]

所以我要做的是将字典变成一个列表,然后从那里获得最小值,但我不知道如何做到这一点,因为我得到了所有值的列表列表。我也不知道如何将其转换为元组。请帮我!! 这是我的代码:

def LowestPrice(storeDict):
valueslist =[]
temp = []
for value in storeDict.values():
    temp=[value]
    valueslist.append(temp)

    for x in valueslist:
        if type(x) == list:
            valueslist.append(min(x))
            minimum = min(values list)

有了这个,我到目前为止我知道我必须使用.items()将字典转换为列表,但是如何将这个列表转换回字典和转换为元组或者最好的方式这样做?

2 个答案:

答案 0 :(得分:5)

你说 -

  

我不知道该怎么做,因为我得到了所有值的列表列表

这是因为在将值列表添加到valueslist之前,您将值列表包含在另一个列表中。所以这是一个列表清单。这发生在 -

temp=[value]
valueslist.append(temp)

一种简单的方法,通过list comphrension和dict.items()`来实现这一点 -

def lowest_price(store_dict):
    return [(k,min(v)) if len(v) > 0 else (k,False) for k,v in store_dict.items()]

说明 -

  1. dict.items()返回字典的键/值对作为元组列表(或在Python 3.x中作为视图),因此我们首先在for循环中迭代它。

  2. min(v)返回列表中的最小值,它是Python中的内置函数。

  3. 在列表推导中,我们循环遍历字典的项目,每次获取键/值,并在每个循环中,我们检查值列表的长度是否大于0,如果是我们正在采取最小值,并且(键值,最小值)被添加到列表中,否则我们将(键,False)添加到列表中。

  4. 上面的for循环方法是 -

    def lowest_price(store_dict):
        retlist = []
        for k,v in store_dict.items():
            if len(v) > 0:
                retlist.append((k,min(v)))
            else:
                retlist.append((k,False))
        return retlist
    

    演示 -

    >>> def lowest_price(store_dict):
    ...     return [(k,min(v)) if len(v) > 0 else (k,False) for k,v in store_dict.items()]
    ...
    >>> storeDict = {"socks" : [6.99, 4.50, 5.00, 4.99], "shoes" : [14.99,19.99],
    ... "napkin" : [],"shirt" : [8.99, 7.00, 6.50, 10.25, 8.99]}
    >>>
    >>> lowest_price(storeDict)
    [('napkin', False), ('shirt', 6.5), ('shoes', 14.99), ('socks', 4.5)]
    

答案 1 :(得分:1)

因为您请求了for循环方法

--onto