0

リストの辞書があり、各リストは 50 項目を超えています。簡単にするために、辞書のキーが ['a','b','c'] であるとします。私は、これらのリストを並べ替えてスライスすることが非常にpythonicであることを理解しようと長い間費やしました。私がこれまでに持っているもの:

dict = dictionary_of_lists under discussion
[dict[k].sort(reverse=True) for k in dict.keys()]
for k, l in dict.items():
    slice = 10 if k in ('a','c') else 20
    dict[k] = l[:slice]

必要に応じて、並べ替えられ、トリミングされたリストになります。[dict[k].sort(reverse=True) for k in dict.keys()]しかし、私が欲しかったのは、並べ替えられたリストに対してスライスするときのような 1 行のコードでした。そして、誰かが分類とスライスを組み合わせる方法を理解できるなら、彼らは私のヒーローです.

更新: まず、多少複雑な質問をすることができるのが好きです。なぜなら、それらはより良いコーディング スキルを学ぶのに役立つからです (私は独学なので)。それでは、以下の皆さんに感謝します!私の新しいコード:

for c in list_of_categories:
    list = [getattr(p,c.name) for p in people if hasattr(p,c.name)]
    slice = c.get_slice_value # I added an @property function to a class named `Category`
    c.total = sum(sorted(list, reverse=True)[:slice])
4

2 に答える 2

1

副作用のあるリスト内包表記は、通常、スタイルが悪いと見なされます。代わりに新しい dict を作成します。

dct = {k: sorted(l, reverse=True)[:10 if k in ('a','c') else 20] 
    for k, l in dct.items()}

また、スライスの値は現時点では任意に見えます。たとえば、次のように個別に構成する方がよい場合があります。

slices = {
    'a': 10,
    'b': 10,
    'c': 20
}    

dct = {k: sorted(l, reverse=True)[:slices[k]] 
    for k, l in dct.items()}
于 2013-02-07T19:30:46.420 に答える
1

sort()その場で機能し、各リストに影響を与えます。新しいものを作成したいでしょう:

[sorted(d[k], reverse = True)[:10 if k in ('a','c') else 20] for k in d.keys()]

読みにくいので注意。

于 2013-02-07T19:30:59.320 に答える