我试图按关键字升序对字典中的值进行排序,但是问题是这些值在关键字中具有两项,而我仅尝试按第二项对它进行排序。如果这样的话。
例如:
{[keyitem1],[keyitem2]:[Value]}
我正在尝试按keyitem2对其进行排序
我尝试通过按其键对它进行排序
尝试#1
order = dict(sorted(mylist.keys()))
#1输出ValueError:
ValueError: dictionary update sequence element #0 has length 54; 2 is required
尝试#2
order = sorted(my_dict, key=operator.itemgetter(1))
#2并没有对它进行排序,只是随机化了
my_dict = {"('first', [0.011])": [1], "('second', [0.012])": [2], "('third', [0.013])": [3], "('fourth', [0.014])": [4], }
my_dict = {"('second', [0.012])": [2], "('fourth', [0.014])": [4], "('first', [0.011])": [1], "('third', [0.013])": [3]}
答案 0 :(得分:0)
您的输入格式不是{[keyitem1],[keyitem2]:[Value]}
。你不能用字典做到这一点。您在这里拥有的是{string: [value]}
。
Python词典无法排序,因为它们的项目没有“顺序”。但是,您可以将数据存储在一个列表中,即在这种情况下为元组列表:
>>> my_dict = {"('first', [0.011])": [1], "('second', [0.012])": [2], "('third', [0.013])": [3], "('fourth', [0.014])": [4]}
>>> L = [ (my_dict[k], k) for k in my_dict ]
>>> L
[([4], "('fourth', [0.014])"), ([3], "('third', [0.013])"), ([1], "('first', [0.011])"), ([2], "('second', [0.012])")]
然后您可以对列表进行排序,该列表将根据在每个项目中看到的第一个子项目对项目进行排序。或创建一个新的排序列表而不触动原始列表的顺序:
>>> my_sorted = sorted(L)
>>> print(my_sorted)
[([1], "('first', [0.011])"), ([2], "('second', [0.012])"), ([3], "('third', [0.013])"), ([4], "('fourth', [0.014])")]
您也可以使用key=
和__getitem__
按值进行排序:
>>> sorted(my_dict, key=my_dict.__getitem__)
["('first', [0.011])", "('second', [0.012])", "('third', [0.013])", "('fourth', [0.014])"]
尽管您的字符串看起来像元组,而您的数字却是单单元格列表,但这让我想知道您是否还可以简化您的工作。也许您真正想要的是“ (1, 'first', 0.011)
形式的元组条目?
答案 1 :(得分:0)
您的键不再是2项元组,它们是2项元组的字符串。在您能够修复键之前,您将无法正确排序。为了按原样回答问题:
使用ast.literal_eval访问元组元素以进行排序逻辑。
my_dict = {"('second', [0.012])": [2], "('fourth', [0.014])": [4], "('first', [0.011])": [1], "('third', [0.013])": [3]}
from ast import literal_eval
order = sorted(my_dict.items(), key = lambda x: literal_eval(x[0])[1]) #x[0] would refer to keys in the tuples created by my_dict.items()
但是,字典固有地认为python中的字典是无序的。如果您特别想要保留顺序的字典,请使用OrderedDict
from collections import OrderedDict
result = OrderedDict(order)
print(result)
#Output:
OrderedDict([("('first', [0.011])", [1]),
("('second', [0.012])", [2]),
("('third', [0.013])", [3]),
("('fourth', [0.014])", [4])])
最后,一个建议。字典可以很好地接受元组作为键,因此,在说完所有内容并加以整理之后,您实际上应该直接使用元组,而不是将它们不必要地转换为字符串。如果第二个元素始终是单个值,则直接使用元组或浮点数。
my_dict = {"('second', [0.012])": [2], "('fourth', [0.014])": [4], "('first', [0.011])": [1], "('third', [0.013])": [3]}
fixed_dict = {(literal_eval(k)[0],literal_eval(k)[1][0]):v for k,v in my_dict.items()}
print(fixed_dict)
#Output
{('second', 0.012): [2],
('fourth', 0.014): [4],
('first', 0.011): [1],
('third', 0.013): [3]}