首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python:元组/字典作为键,选择,排序

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

Stack Overflow用户
提问于 2011-02-03 03:24:11
回答 4查看 171K关注 0票数 113

假设我有大量不同颜色的水果,例如24个蓝色香蕉,12个青苹果,0个蓝色草莓等等。我想在Python中以一种数据结构来组织它们,这样可以方便地进行选择和排序。我的想法是将它们放入一个以元组为关键字的字典中,例如,

代码语言:javascript
复制
{
    ('banana',    'blue' ): 24,
    ('apple',     'green'): 12,
    ('strawberry','blue' ): 0,
    # ...
}

或者甚至是字典,例如,

代码语言:javascript
复制
{
    {'fruit': 'banana',    'color': 'blue' }: 24,
    {'fruit': 'apple',     'color': 'green'}: 12,
    {'fruit': 'strawberry','color': 'blue' }: 0,
    # ...
}

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

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

欢迎所有建议!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-02-03 03:34:17

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

请注意,在不做一些额外工作的情况下,您不能将dict用作dict中的键,因此这不是一个很好的解决方案。

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

代码语言:javascript
复制
>>> 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'

现在你可以使用你的水果计数字典了:

代码语言:javascript
复制
>>> fruitcount = {Fruit("banana", "red"):5}
>>> fruitcount[f]
5

其他技巧:

代码语言:javascript
复制
>>> 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,要获得一个水果的所有颜色的列表,你必须过滤关键字,即

代码语言:javascript
复制
bananas = [fruit for fruit in fruits if fruit.name=='banana']
票数 156
EN

Stack Overflow用户

发布于 2011-02-03 03:37:24

在这种情况下,字典可能不是您应该使用的。一个功能更全的库将是一个更好的选择。可能是一个真正的数据库。最简单的是sqlite。您可以通过传递字符串“:memory:”而不是文件名来将整个代码保存在内存中。

如果您确实想沿着这条路径继续下去,可以使用键或值中的额外属性来执行此操作。然而,字典不能成为另一个字典的关键字,但元组可以。The docs解释什么是允许的。它必须是一个不可变的对象,其中包括字符串、数字和只包含字符串和数字的元组(以及递归地只包含这些类型的元组...)。

你可以用d = {('apple', 'red') : 4}做你的第一个例子,但是查询你想要的东西会非常困难。你需要这样做:

代码语言:javascript
复制
#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')]
票数 13
EN

Stack Overflow用户

发布于 2011-02-03 03:52:54

使用关键字作为元组,您只需使用给定的第二个组件筛选关键字并对其进行排序:

代码语言:javascript
复制
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,并在其中动态添加任何属性:

代码语言:javascript
复制
k = Foo()
k.color = 'blue'

这些实例可以用作dict key,但要注意它们的易变性!

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4878881

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档