假设我有大量不同颜色的水果,例如24个蓝色香蕉,12个青苹果,0个蓝色草莓等等。我想在Python中以一种数据结构来组织它们,这样可以方便地进行选择和排序。我的想法是将它们放入一个以元组为关键字的字典中,例如,
{
('banana', 'blue' ): 24,
('apple', 'green'): 12,
('strawberry','blue' ): 0,
# ...
}
或者甚至是字典,例如,
{
{'fruit': 'banana', 'color': 'blue' }: 24,
{'fruit': 'apple', 'color': 'green'}: 12,
{'fruit': 'strawberry','color': 'blue' }: 0,
# ...
}
例如,我想检索所有蓝色水果或所有颜色的香蕉的列表,或者按水果的名称对这本字典进行排序。有没有办法以一种干净的方式做到这一点?
将元组作为键的字典很可能不是处理这种情况的正确方法。
欢迎所有建议!
发布于 2011-02-03 03:34:17
就我个人而言,我喜欢python的一件事是tuple-dict组合。这里实际上是一个二维数组(其中x=水果名称,y=颜色),我通常支持实现二维数组的元组字典,至少在像numpy
或数据库这样的东西不太合适的情况下是这样。所以简而言之,我认为你有一个很好的方法。
请注意,在不做一些额外工作的情况下,您不能将dict用作dict中的键,因此这不是一个很好的解决方案。
也就是说,您还应该考虑namedtuple()。这样你就可以这样做了:
>>> 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 = {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,要获得一个水果的所有颜色的列表,你必须过滤关键字,即
bananas = [fruit for fruit in fruits if fruit.name=='banana']
发布于 2011-02-03 03:37:24
在这种情况下,字典可能不是您应该使用的。一个功能更全的库将是一个更好的选择。可能是一个真正的数据库。最简单的是sqlite。您可以通过传递字符串“:memory:”而不是文件名来将整个代码保存在内存中。
如果您确实想沿着这条路径继续下去,可以使用键或值中的额外属性来执行此操作。然而,字典不能成为另一个字典的关键字,但元组可以。The docs解释什么是允许的。它必须是一个不可变的对象,其中包括字符串、数字和只包含字符串和数字的元组(以及递归地只包含这些类型的元组...)。
你可以用d = {('apple', 'red') : 4}
做你的第一个例子,但是查询你想要的东西会非常困难。你需要这样做:
#find all apples
apples = [d[key] for key in d.keys() if key[0] == 'apple']
#find all red items
red = [d[key] for key in d.keys() if key[1] == 'red']
#the red apple
redapples = d[('apple', 'red')]
发布于 2011-02-03 03:52:54
使用关键字作为元组,您只需使用给定的第二个组件筛选关键字并对其进行排序:
blue_fruit = sorted([k for k in data.keys() if k[1] == 'blue'])
for k in blue_fruit:
print k[0], data[k] # prints 'banana 24', etc
排序之所以有效,是因为如果元组的组件具有自然排序,那么元组就具有自然排序。
使用keys作为相当成熟的对象,您只需按k.color == 'blue'
过滤即可。
您不能真正使用dict作为键,但您可以创建一个最简单的类,如class Foo(object): pass
,并在其中动态添加任何属性:
k = Foo()
k.color = 'blue'
这些实例可以用作dict key,但要注意它们的易变性!
https://stackoverflow.com/questions/4878881
复制相似问题