【问题标题】:dictionary to list of tuples with smallest value字典到具有最小值的元组列表
【发布时间】:2015-12-04 20:32:18
【问题描述】:

好的,所以我正在尝试编写一个函数,该函数将字典作为参数并返回一个元组列表,其中第一项作为键,第二个值作为最低值项。此外,如果字典的值是空的,那么元组应该在那个地方有一个 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() 将字典转换为列表,但是如何将此列表转换回字典和元组,或者最好的方法是什么这样做?

【问题讨论】:

    标签: python list dictionary tuples min


    【解决方案1】:

    你说-

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

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

    temp=[value]
    valueslist.append(temp)
    

    通过列表理解和 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,如果是我们取它的最小值,并且 (key, minimum of value) 被添加到列表中,否则我们将 (key, False) 添加到列表中。

    上面的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)]
    

    【讨论】:

    • 您也可以使用(k,min(v) if len(v) else False)。甚至(k, min(v or [False]))
    • 如果我想在单独的行中执行它然后在最后返回它,我该怎么做?我很难一口气全部理解。
    • 如果我想在单独的行中执行它然后在最后返回它,我该怎么做?我很难在一行中全部理解。因此,如果我想让它看起来像这样: def minimum_price(store_dict): newdict = {} for keys, values in store_dict.items(): if len(values) > 0: (keys,min(values)) else: (keys,False) return 我如何返回它?喜欢您可以添加更多变量和详细信息,以便更容易理解吗?
    • 好的,我会添加解释该行的作用。
    • @April 我已经为答案添加了解释,还添加了相同的列表理解的 for 循环方法。
    【解决方案2】:

    既然您要求使用 for 循环方法

    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]}
    
    def lowestPrice(storeDict):
        valueslist =[] # init empty list
        for k,v in storeDict.iteritems(): # iterate dict
            if len(v) > 0: # if list has elements
                valueslist.append((k,min(v))) # find min element and append
            else:
                valueslist.append((k,False)) # append with value = False
        return valueslist
    
    print lowestPrice(storeDict)
    

    【讨论】:

    • 您可以通过说if v:来检查列表是否包含元素
    猜你喜欢
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 2016-09-03
    • 1970-01-01
    • 2019-02-14
    • 2018-07-31
    相关资源
    最近更新 更多