如何对作为字典值的列表进行排序?
How do I sort a list which is a value of dictionaries?
我需要使用计算成本较低的函数对作为字典值的列表进行排序。我不能分享原始代码,所以请帮我看下面的例子。
我尝试了标准方法,我解析了值,使用中间列表进行排序并将其存储在计算密集型的新字典中。我正在努力简化它,为此,我期待任何建议或合并方式。
输入
a= {'a':1, 'b': [2,8,4,3], 'c':['c',5,7,'a',6]}
输出
a= {'a':1, 'b': [2,3,4,8], 'c':['a','c',5,6,7]}
一般来说(如果您的值是 可比较 项的列表,例如只有数字),您可以这样做
sorted_dict = {key: sorted(value) for key, value in original_dict.items()}
如果您的值是单一的 numbers/strings,您应该将 sorted(value)
更改为 sorted(value) if isinstance(value, list) else value
。 (感谢用户 @DeepSpace
指出)。
但是,您给出的示例无效,除非 a
和 c
引用整数值。
您不需要对字典进行排序,您需要对字典中列表中的所有值进行排序。您根本不需要创建任何新对象:
a= {'a':1, 'b': [2,8,4,3], 'c':['c',5,7,'a',6]} # changed c and a to be strings
for e in a:
if isinstance(a[e],list):
a[e].sort() # inplace sort the lists
print(a)
输出:
{'a': 1, 'c': [5, 6, 7, 'a', 'c'], 'b': [2, 3, 4, 8]}
这不会创建新的字典,也不会创建新的列表——它只是就地对列表进行排序。你无法获得太多 faster/less 计算,除非你对你的列表有特殊的领域知识,这将使编程成为一个专门的就地排序器来替代 list.sort() 可行。
在 Python 3(感谢@Matthias Profil) comparison between int ansd str give TypeError - you can "fix" that with some optional computation ( inspired by answers at: python-list-sort-query-when-list-contains-different-element-types):
def IsString(item):
return isinstance(item,str)
def IsInt(item):
return isinstance(item,int)
a= {'a':1, 'b': [2,8,4,3], 'c':['c',5,7,'a',6]} # changed c and a to be strings
for e in a:
if isinstance(a[e],list):
try:
a[e].sort() # inplace sort the lists
except TypeError:
str_list = sorted(filter(IsString,a[e]))
int_list = sorted(filter(IsInt,a[e]))
a[e] = int_list + str_list # default to numbers before strings
print(a)
我需要使用计算成本较低的函数对作为字典值的列表进行排序。我不能分享原始代码,所以请帮我看下面的例子。
我尝试了标准方法,我解析了值,使用中间列表进行排序并将其存储在计算密集型的新字典中。我正在努力简化它,为此,我期待任何建议或合并方式。
输入
a= {'a':1, 'b': [2,8,4,3], 'c':['c',5,7,'a',6]}
输出
a= {'a':1, 'b': [2,3,4,8], 'c':['a','c',5,6,7]}
一般来说(如果您的值是 可比较 项的列表,例如只有数字),您可以这样做
sorted_dict = {key: sorted(value) for key, value in original_dict.items()}
如果您的值是单一的 numbers/strings,您应该将 sorted(value)
更改为 sorted(value) if isinstance(value, list) else value
。 (感谢用户 @DeepSpace
指出)。
但是,您给出的示例无效,除非 a
和 c
引用整数值。
您不需要对字典进行排序,您需要对字典中列表中的所有值进行排序。您根本不需要创建任何新对象:
a= {'a':1, 'b': [2,8,4,3], 'c':['c',5,7,'a',6]} # changed c and a to be strings
for e in a:
if isinstance(a[e],list):
a[e].sort() # inplace sort the lists
print(a)
输出:
{'a': 1, 'c': [5, 6, 7, 'a', 'c'], 'b': [2, 3, 4, 8]}
这不会创建新的字典,也不会创建新的列表——它只是就地对列表进行排序。你无法获得太多 faster/less 计算,除非你对你的列表有特殊的领域知识,这将使编程成为一个专门的就地排序器来替代 list.sort() 可行。
在 Python 3(感谢@Matthias Profil) comparison between int ansd str give TypeError - you can "fix" that with some optional computation ( inspired by answers at: python-list-sort-query-when-list-contains-different-element-types):
def IsString(item):
return isinstance(item,str)
def IsInt(item):
return isinstance(item,int)
a= {'a':1, 'b': [2,8,4,3], 'c':['c',5,7,'a',6]} # changed c and a to be strings
for e in a:
if isinstance(a[e],list):
try:
a[e].sort() # inplace sort the lists
except TypeError:
str_list = sorted(filter(IsString,a[e]))
int_list = sorted(filter(IsInt,a[e]))
a[e] = int_list + str_list # default to numbers before strings
print(a)