Python:元组/字典作为键、选择、排序

Python: Tuples/dictionaries as keys, select, sort(Python:元组/字典作为键、选择、排序)
本文介绍了Python:元组/字典作为键、选择、排序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

假设我有大量不同颜色的水果,例如,24 个蓝色香蕉、12 个绿色苹果、0 个蓝色草莓等.我想将它们组织在 Python 中的数据结构中,以便于选择和排序.我的想法是将它们放入以元组为键的字典中,例如,

Suppose I have quantities of fruits of different colors, e.g., 24 blue bananas, 12 green apples, 0 blue strawberries and so on. I'd like to organize them in a data structure in Python that allows for easy selection and sorting. My idea was to put them into a dictionary with tuples as keys, e.g.,

{
    ('banana',    'blue' ): 24,
    ('apple',     'green'): 12,
    ('strawberry','blue' ): 0,
    # ...
}

甚至是字典,例如,

{
    {'fruit': 'banana',    'color': 'blue' }: 24,
    {'fruit': 'apple',     'color': 'green'}: 12,
    {'fruit': 'strawberry','color': 'blue' }: 0,
    # ...
}

例如,我想检索所有蓝色水果或所有颜色的香蕉的列表,或者按水果名称对字典进行排序.有没有办法以干净的方式做到这一点?

I'd like to retrieve a list of all blue fruit, or bananas of all colors, for example, or to sort this dictionary by the name of the fruit. Are there ways to do this in a clean way?

很可能以元组为键的字典不是处理这种情况的正确方法.

It might well be that dictionaries with tuples as keys are not the proper way to handle this situation.

欢迎所有建议!

推荐答案

就我个人而言,我喜欢 python 的一件事是 tuple-dict 组合.你在这里实际上是一个二维数组(其中 x = 水果名称和 y = 颜色),我通常是实现二维数组的元组字典的支持者,至少在类似 numpy 的情况下或者数据库不是更合适的.所以简而言之,我认为你有一个很好的方法.

Personally, one of the things I love about python is the tuple-dict combination. What you have here is effectively a 2d array (where x = fruit name and y = color), and I am generally a supporter of the dict of tuples for implementing 2d arrays, at least when something like numpy or a database isn't more appropriate. So in short, I think you've got a good approach.

请注意,如果不做一些额外的工作,您不能将 dicts 用作 dict 中的键,因此这不是一个很好的解决方案.

Note that you can't use dicts as keys in a dict without doing some extra work, so that's not a very good solution.

也就是说,您还应该考虑 namedtuple().这样你就可以这样做了:

That said, you should also consider namedtuple(). That way you could do this:

>>> from collections import namedtuple
>>> Fruit = namedtuple("Fruit", ["name", "color"])
>>> f = Fruit(name="banana", color="red")
>>> print f
Fruit(name='banana', color='red')
>>> f.name
'banana'
>>> f.color
'red'

现在你可以使用你的fruitcount dict:

Now you can use your fruitcount dict:

>>> fruitcount = {Fruit("banana", "red"):5}
>>> fruitcount[f]
5

其他技巧:

>>> fruits = fruitcount.keys()
>>> fruits.sort()
>>> print fruits
[Fruit(name='apple', color='green'), 
 Fruit(name='apple', color='red'), 
 Fruit(name='banana', color='blue'), 
 Fruit(name='strawberry', color='blue')]
>>> fruits.sort(key=lambda x:x.color)
>>> print fruits
[Fruit(name='banana', color='blue'), 
 Fruit(name='strawberry', color='blue'), 
 Fruit(name='apple', color='green'), 
 Fruit(name='apple', color='red')]

与 chmullig 相呼应,要获得一种水果所有颜色的列表,您必须过滤键,即

Echoing chmullig, to get a list of all colors of one fruit, you would have to filter the keys, i.e.

bananas = [fruit for fruit in fruits if fruit.name=='banana']

这篇关于Python:元组/字典作为键、选择、排序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Leetcode 234: Palindrome LinkedList(Leetcode 234:回文链接列表)
How do I read an Excel file directly from Dropbox#39;s API using pandas.read_excel()?(如何使用PANDAS.READ_EXCEL()直接从Dropbox的API读取Excel文件?)
subprocess.Popen tries to write to nonexistent pipe(子进程。打开尝试写入不存在的管道)
I want to realize Popen-code from Windows to Linux:(我想实现从Windows到Linux的POpen-code:)
Reading stdout from a subprocess in real time(实时读取子进程中的标准输出)
How to call type safely on a random file in Python?(如何在Python中安全地调用随机文件上的类型?)