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()]我对排序列表进行切片时一样。如果有人能弄清楚如何将分类和切片放在一起,他们将是我的英雄。

更新:首先,我喜欢能够提出一些复杂的问题,因为它们可以帮助我学习更好的编码技能(因为我是自学的)。所以谢谢楼下的每一个人!我的新代码:

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

具有副作用的列表推导通常被认为是不好的风格。而是创建一个新的字典:

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 回答