1. ホーム
  2. python

[解決済み] Python タプル/辞書をキーに、セレクト、ソート

2022-09-06 05:01:23

質問

例えば、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,
    # ...
}

例えば、すべての青い果物のリストや、すべての色のバナナを取得したり、果物の名前でこの辞書をソートしたいのですが、どうすればよいでしょうか?これをきれいに行う方法はありますか?

それは、タプルをキーとするディクショナリが 適切な の方法で処理する必要があります。

すべての提案を歓迎します。

どのように解決するのですか?

個人的に、私がPythonについて好きなことの1つは、タプルとディクトの組み合わせです。ここにあるのは事実上 2 次元配列 (x = 果物の名前、y = 色) で、私は一般に 2 次元配列を実装するためのタプルのディクテの支持者です、少なくとも次のような場合は。 numpy やデータベースがより適切でない場合、2次元配列を実装するためのタプルのディクショナリーを一般的に支持しています。ですから、要するに、あなたは良いアプローチを持っていると思います。

ディクテをキーとして使うには、余分な作業をしなければならないので、あまり良い解決策とは言えないことに注意してください。

とはいえ、あなたはまた 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の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と同じように、ある果物のすべての色のリストを得るには、キーにフィルタをかける必要があります、すなわち。

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