对列表字典进行排序

2024-09-30 01:23:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下字典:

my_dict = {"user": [1, 2, 3, 4], "sex": ['M', 'F', 'O', 'F'],"timeOfArrival": [4, 1, 3, 8]}

我想找到一种基于timeOfArrival键对其进行排序的方法,如以下示例所示:

my_dict = {"user": [2,3,1,4 ], "sex": ['F', 'O', 'M', 'F' ],"timeOfArrival": [4, 1, 3, 8]}

现在我很难想出一个直截了当的解决办法

我尝试的是对timeOfArrival进行排序,然后我尝试在my_dict内部循环,这样我可以将值重新排列到它们的“正确”位置,这很有效,但是如果我有重复的值(即"timeOfArrival": [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

Tags: keynameinposfordictionary字典排序
3条回答

数据可以与^{}合并

my_dict = {
    "user": [1, 2, 3, 4],
    "sex": ['M', 'F', 'O', 'F'],
    "timeOfArrival": [4, 1, 3, 8]}

print(list(zip(my_dict['timeOfArrival'], my_dict['user'], my_dict['sex'])))

这会给你

[(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))

现在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])

我建议您使用“Insertion Sort”算法

我修改了它以适合您的示例,它似乎可以按照您的意愿执行:


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]}

问候

我想这就是你要找的。它通过获取排序的到达时间的索引来确定排序顺序。然后,我使用索引顺序对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]

相关问题 更多 >

    热门问题