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']
相关文章