我有一个列表字典,每个列表大于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])
答案 0 :(得分: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()}
答案 1 :(得分:1)
sort()
适用于每个列表。你想创造新的:
[sorted(d[k], reverse = True)[:10 if k in ('a','c') else 20] for k in d.keys()]
请注意,它的可读性不高。