【问题标题】:Sorting arrays in python [duplicate]在python中对数组进行排序[重复]
【发布时间】:2021-07-23 06:38:36
【问题描述】:

我有一个可变数字数组。 我有另一个数组,我想成为数字数组的标签。

myList = [T1_sum, T2_sum, T3_sum, T4_sum, T5_sum, T6_sum, T7_sum, T8_sum, T9_sum, T10_sum]
mylables = ["cats", "dogs", "monkey", "fish", "rabbit", "owl", "pig", "goat", "cow", "bull"]

我想按从最大值到最小值对数组进行排序。我是这样做的:

sortedlist = sorted(myList, reverse=True) 

但是,如何重新排列标签以使其与值一致? 我需要保留它,以便 sortedlabellist 是它自己的单独数组(用于未来的事情)。所以我可能不得不将值链接到标签,然后单独拉出sortedlabellist

【问题讨论】:

  • 从外观上看,您应该使用字典结构 - w3schools.com/python/python_dictionaries.asp
  • 把它变成dictionary&你可以随时拉出字典'labels'并用label_list = list(my_dict)把它们放到一个列表中
  • 感谢感谢。这有效
  • 作为更一般的规则,任何时候你有两个需要保持完美同步的数据结构,这是一个非常有力的线索,它们应该是一个单一的数据结构。字典是一种选择;另一种方法是将其设为一个元组列表(或者可能是NamedTuples)。这些方法中的任何一种都可以使排序问题变得非常简单。
  • 这能回答你的问题吗? Sorting list based on values from another list

标签: python list


【解决方案1】:

您可以只形成一个字典,以便在排序时保持两个列表的顺序:

>>> labelToSum = {key:value for key,value in zip(mylables, myList)}
>>> labelToSum
{'cats': 2,
 'dogs': 4,
 'monkey': 1,
 'fish': 7,
 'rabbit': 3,
 'owl': 8,
 'pig': 4,
 'goat': 5,
 'cow': 9,
 'bull': 4}

然后您可以根据值对字典进行排序,如下所示:

>>> {k: v for k, v in reversed(sorted(labelToSum.items(), key=lambda item: item[1]))}
{'cow': 9,
 'owl': 8,
 'fish': 7,
 'goat': 5,
 'bull': 4,
 'pig': 4,
 'dogs': 4,
 'rabbit': 3,
 'cats': 2,
 'monkey': 1}

【讨论】:

  • 这假设键是唯一的(在这里可能没问题)。在 python 3.7/3.6 之前,排序和放回字典也会失败,其中字典不保留插入顺序
  • 您不需要字典理解。只需:labelToSum = dict(zip(myTables, myList))
【解决方案2】:

您可以使用列表推导和 zip():

[x for _, x in sorted(zip(myList, mylables), reverse=True)]

【讨论】:

    【解决方案3】:

    如果您想避免使用字典,可以使用zip 并解压缩 (*zip):

    sortedList, sortedLables = zip(*sorted(zip(myList, mylables), reverse=True))
    

    事实上,解包将序列作为元组返回。如果您需要它作为列表,您可以再次将其转换为列表:

    sortedList, sortedLables = list(sortedList), list(sortedLables)
    print(sortedList)
    print(sortedLables)
    
    # Output
    ['T9_sum', 'T8_sum', 'T7_sum', 'T6_sum', 'T5_sum', 'T4_sum', 'T3_sum', 'T2_sum', 'T1_sum', 'T10_sum']
    ['cow', 'goat', 'pig', 'owl', 'rabbit', 'fish', 'monkey', 'dogs', 'cats', 'bull']
    

    【讨论】:

      【解决方案4】:

      你可以这样做。

      sortedlabellist = [x for _, x in sorted(zip(myList, mylables), reverse = True)]
      

      【讨论】:

        【解决方案5】:

        这里的问题是您选择的数据结构并不合适。如果您只想将 myList 的每个元素与 mylables 的元素相关联,那么元组列表 [("cats", T1_sum), ("dogs", T2_sum), ...]应该足够了。

        假设两个列表的长度相同(以免丢失信息),

        zip(mylables,myList)
        

        获取元组列表。然后你应该按第一个组件对其进行排序。

        现在,如果您有关于列表的更多信息,假设 mylables (["cats", "dogs", ...]) 中的每个元素只出现一次,然后选择字典 ( Python 中的数据结构)以 mylables 元素作为键,myList 元素作为值,将使搜索操作和排序操作更加高效。

        假设两个列表的长度相同(以免丢失信息),

        myDictionary = dict(zip(mylables,myList))
        

        给你一个可以用下一行排序的字典:

        sorted(myDictionary)
        

        【讨论】:

          猜你喜欢
          • 2013-05-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-25
          • 1970-01-01
          • 2021-12-03
          • 2014-05-17
          • 2021-02-07
          相关资源
          最近更新 更多