Python 对列表字典进行排序
我有以下字典:Python 对列表字典进行排序,python,sorting,dictionary,Python,Sorting,Dictionary,我有以下字典: my_dict={“user”:[1,2,3,4],“sex”:['M','F','O','F'],“到达时间”:[4,1,3,8]} 我想找到一种根据timeOfArrival键对其进行排序的方法,如下例所示: my_dict={“user”:[2,3,1,4],“sex”:['F','O','M','F'],“到达时间”:[4,1,3,8]} 现在我很难想出一个直截了当的解决办法 我尝试的是排序到达时间,然后我尝试在我的dict中循环,这样我可以将值重新排列到它们的“正确”位
my_dict={“user”:[1,2,3,4],“sex”:['M','F','O','F'],“到达时间”:[4,1,3,8]}
我想找到一种根据timeOfArrival
键对其进行排序的方法,如下例所示:
my_dict={“user”:[2,3,1,4],“sex”:['F','O','M','F'],“到达时间”:[4,1,3,8]}
现在我很难想出一个直截了当的解决办法
我尝试的是排序到达时间
,然后我尝试在我的dict
中循环,这样我可以将值重新排列到它们的“正确”位置,这很有效,但是如果我有重复的值(即“到达时间”:[4,4,3,1]
),我会得到一个比我一开始给它的字典更大的字典
有没有更好的方法来整理我的字典
def sortDict(dictionary={},name="test"):
sortedList=sorted(my_dict[name])
dictKeys=list(dictionary.keys())
testDict={}
for i in dictKeys:
testDict[i]=[]
for key in dictKeys:
for item in sortedList:
for pos in range(0,len(dictionary[name])):
if(item==dictionary[name][pos]):
testDict[key].append(dictionary[key][pos])
return testDict
您需要先压缩,然后进行排序:
# your unsorted dictionary
my_dict = {"user": [1, 2, 3, 4], "sex": ['M', 'F', 'O', 'F'],"timeOfArrival": [4, 1, 3, 8]}
# your sorted dictionary
sorted_dict = {}
# zip lists, sort by timeOfArrival and unpack into the new dictionary
sorted_dict["user"], sorted_dict["sex"], sorted_dict["timeOfArrival"] = zip(*sorted(zip(my_dict["timeOfArrival"], my_dict["user"], my_dict["sex"])))
# convert the tuples in the new dictionary into a list
sorted_dict["user"] = list(sorted_dict["user"])
sorted_dict["sex"] = list(sorted_dict["sex"])
sorted_dict["timeOfArrival"] = list(sorted_dict["timeOfArrival"])
# you're done ;-)
print(sorted_dict)
# {'user': [1, 3, 4, 8], 'sex': [2, 3, 1, 4], 'timeOfArrival': ['F', 'O', 'M', 'F']}
然后用这些新排序的列表重新构建您的字典。数据可以与合并 这会给你
[(4, 1, 'M'), (1, 2, 'F'), (3, 3, 'O'), (8, 4, 'F')]
这是可以分类的
data = list(sorted(zip(my_dict['timeOfArrival'], my_dict['user'], my_dict['sex'])))
print(data)
结果:
[(1, 2, 'F'), (3, 3, 'O'), (4, 1, 'M'), (8, 4, 'F')]
解压缩已排序的数据:
data = list(zip(*data))
现在,数据
如下所示:
[(1, 3, 4, 8), (2, 3, 1, 4), ('F', 'O', 'M', 'F')]
最后,排序后的数据必须放回匹配的字典条目
my_dict['user'] = list(data[1])
my_dict['sex'] = list(data[2])
现在my_dict
包含{'user':[2,3,1,4],'sex':['F','O','M','F'],'timeOfArrival':[4,1,3,8]}
压缩版本
my_dict = {
"user": [1, 2, 3, 4],
"sex": ['M', 'F', 'O', 'F'],
"timeOfArrival": [4, 1, 3, 8]}
data = list(zip(*sorted(zip(my_dict['timeOfArrival'], my_dict['user'], my_dict['sex']))))
my_dict['user'] = list(data[1])
my_dict['sex'] = list(data[2])
我想这就是你要找的。它通过获取排序的到达时间的索引来确定排序顺序。然后,我使用索引顺序对dict中的所有列表进行排序
order = [i for i, _ in sorted(enumerate(my_dict['timeOfArrival']), key=lambda x: x[1])]
for key, value in my_dict.items():
if key != 'timeOfArrival': # Expected output shows timeOfArrival should not be sorted
my_dict[key] = [value[i] for i in order]
我建议您使用“”算法
我修改了它以适合您的示例,它似乎可以按照您的意愿执行:
my_dict = {"user": [2,3,1,4 ], "sex": ['F', 'O', 'M', 'F' ],"timeOfArrival": [4, 1, 3, 8]}
def insertion_sort(my_dict):
for k in range(1, len(my_dict['timeOfArrival'])):
cur_timeOfArrival = my_dict['timeOfArrival'][k]
cur_sex = my_dict['sex'][k]
cur_user = my_dict['user'][k]
j=k
while j > 0 and my_dict['timeOfArrival'][j-1] > cur_timeOfArrival:
my_dict['timeOfArrival'][j] = my_dict['timeOfArrival'][j-1]
my_dict['sex'][j] = my_dict['sex'][j-1]
my_dict['user'][j] = my_dict['user'][j-1]
j -= 1
my_dict['timeOfArrival'][j] = cur_timeOfArrival
my_dict['sex'][j] = cur_sex
my_dict['user'][j] = cur_user
return my_dict
print(insertion_sort(my_dict))
#{'user': [3, 1, 2, 4], 'sex': ['O', 'M', 'F', 'F'], 'timeOfArrival': [1, 3, 4, 8]}
问候。我只需要对我的字典进行排序,并将我的列表彼此分开,这样就可以像这样组合列表:
[(4,1,'M'),(1,2,'F'),(3,3,'O'),(8,4,'F')]
这是不可能的
感谢大家抽出时间,更重要的是,感谢@MauriceMeyer,我让它工作起来了
def sortDict(dictionary={},name="test"):
sortedList=sorted(my_dict[name])
dictKeys=list(dictionary.keys())
testDict={}
for key in dictKeys:
testDict[key]=[x for _,x in sorted(zip(my_dict[name],my_dict[key]))]
return testDict
这回答了你的问题吗?这个问题与词典的分类无关。这是关于排序和同步多个列表的。@jarmod显然我没有正确解释我的问题。我不需要对多个列表进行排序,我需要根据其中一个列表对词典进行排序。同步花费的时间比repositioning@MauriceMeyer我将尝试实现它,然后回到您那里与您分享results@MauriceMeyer这很有效,谢谢。我举了一个例子。这个想法是可靠的,但我需要找到一种在不改变答案的情况下对dict排序的方法。这有意义吗?我评论道..您可能需要添加
if key!='到达时间’:
在for循环的中。到达时间在for循环之前没有在字典中排序。这是正确的,不应该在for循环之后排序。看看问题和预期结果,你是对的。我会再检查一遍,看看这是故意的还是一个错误。很值得理解的是,你不是在整理字典。
def sortDict(dictionary={},name="test"):
sortedList=sorted(my_dict[name])
dictKeys=list(dictionary.keys())
testDict={}
for key in dictKeys:
testDict[key]=[x for _,x in sorted(zip(my_dict[name],my_dict[key]))]
return testDict