Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将其作为列表返回_Python_Dictionary_Nested Lists - Fatal编程技术网

Python 如何将其作为列表返回

Python 如何将其作为列表返回,python,dictionary,nested-lists,Python,Dictionary,Nested Lists,我有以下数据: inventory = { HAMMER: (10,100), SCREW: (1, 1000), NAIL: (1, 1000), SCREWDRIVER: (8, 100), DRILL: (50, 20), WORKBENCH: (150, 5), HANDSAW: (15, 50),

我有以下数据:

inventory = { HAMMER: (10,100),
              SCREW: (1, 1000),
              NAIL: (1, 1000),
              SCREWDRIVER: (8, 100),
              DRILL: (50, 20),
              WORKBENCH: (150, 5),
              HANDSAW: (15, 50),
              CHAINSAW: (80, 30)
            }
我已经编写了以下函数:

def get_items(cheapness):
    """ Return a list of (item, (price, count)) tuples that are the given
    cheapness. Note that the second element of the tuple is another tuple. """

    if cheapness == 'CHEAP':
        return [(key, value) for (key,value) in inventory.items() if value in ((cost,quantity) for (cost, quantity) in inventory.values() if cost < 20)]
    elif cheapness == 'MODERATE':
        return [(key, value) for (key,value) in inventory.items() if value in ((cost,quantity) for (cost, quantity) in inventory.values() if 20 < cost < 100)]
    elif cheapness == 'EXPENSIVE':
        return [(key, value) for (key,value) in inventory.items() if value in ((cost,quantity) for (cost, quantity) in inventory.values() if cost > 100)]
def get_项目(便宜):
“”“返回给定的(项、(价格、计数))元组列表。”
便宜。请注意,元组的第二个元素是另一个元组。”“”
如果便宜==“便宜”:
返回库存中(键,值)的[(键,值)。如果库存中(成本,数量)的((成本,数量)中的值为,则返回项()。如果成本<20,则返回值()]
elif Cheapity==“中等”:
返回库存中(键,值)的[(键,值)。如果库存中(成本,数量)的值为((成本,数量),则返回项目()。如果20<成本<100,则返回值()]
elif cheapness==“昂贵”:
返回库存中(键,值)的[(键,值)。如果库存中(成本,数量)的((成本,数量)中有值,则返回项()。如果成本>100,则返回值()]
我的问题是,当我执行
打印类型(获取项目(便宜))
时,我会获取
。如何将结果作为列表返回?

说出您的意思:

def get_items(cheapness):
    """ Return a list of (item, (price, count)) tuples that are the given
    cheapness. Note that the second element of the tuple is another tuple. """

    if cheapness == 'CHEAP':
        return [(item, (price,count)) for (item, (price,count)) in inventory.items() if price < 20]
    elif cheapness == 'MODERATE':
        return [(item, (price,count)) for (item, (price,count)) in inventory.items() if price > 20 and price < 100]
    elif cheapness == 'EXPENSIVE':
        return [(item, (price,count)) for (item, (price,count)) in inventory.items() if price > 100]
def get_项目(便宜):
“”“返回给定的(项、(价格、计数))元组列表。”
便宜。请注意,元组的第二个元素是另一个元组。”“”
如果便宜==“便宜”:
返回库存中(项目,(价格,计数))的[(项目,(价格,计数)]。如果价格<20,则返回项目()
elif cheapness==“中等”:
返回库存中(项目,(价格,计数))的[(项目,(价格,计数)]。如果价格>20且价格<100,则返回项目()
elif cheapness==“昂贵”:
返回库存中(项目,(价格,计数))的[(项目,(价格,计数)]。如果价格>100,则返回项目()

打印类型(获取项目(“便宜”)如何?(注意引号)

此代码功能更强大,可能更易于维护:

def get_items(cheapness):
    def a(value):
        if cheapness == 'CHEAP':
            return value < 20
        if cheapness == 'MODERATE':
            return value >= 20 and value < 100
        if cheapness == 'EXPENSIVE':
            return value >= 100
        return False
    return filter(lambda x: a(x[1][0]), inventory.items())
def get_项目(便宜):
def a(值):
如果便宜==“便宜”:
返回值<20
如果便宜=‘适中’:
返回值>=20且值<100
如果便宜=‘昂贵’:
返回值>=100
返回错误
返回筛选器(lambda x:a(x[1][0]),inventory.items()

事实上,我认为这是您当前的问题。您的所有案例最坏情况下都应该返回[],而不是一个都没有;您正在从get_items()的末尾掉下来,没有返回。但我的答案还是更清楚、更有效的(他谦虚地说)。恐怕我还没有真正达到使用lambda的程度。不过我很喜欢拉塞尔·博罗戈夫的回答。我可以问一下,你的代码有多像python?我总是问自己,当我看到同一行代码重复多次时,我如何才能做得更好。在你的情况下,你写了三次相同的理解列表。唯一的区别是条件语句。Mine将条件语句提取到函数中,并利用Python内置的函数工具(即:
filter
lambda
);它更多的是功能性编程风格。当过滤条件变得更复杂时,它的伸缩性比我的解决方案好一点。足够公平了。从长远来看,这段代码也更容易维护。假设您必须再添加三个
便宜度
级别。在代码中,这意味着复制/粘贴列表并修改条件。现在,当清单字典更改时会发生什么情况(例如,将评级值添加到元组)?您现在有六行需要更改。用我的代码,你有一个。PS:编辑了我的答案,指出它比Pythonic更实用。@RJ Regenold这是一个很好的观点。谢谢但我会接受Russell的,因为这是我现在理解的解决方案,因为我的无知。但这是OP现在理解的解决方案,因为他的无知。保持优雅。