【问题标题】:Python: Arguments to sorting functionPython:排序函数的参数
【发布时间】:2016-05-19 20:10:28
【问题描述】:

我正在尝试对 python 字符串列表进行排序。我知道我可以使用 sorted 方法并将属性键设置为实现对字典元素进行排序所需的行为的函数。我的问题是这个方法需要一个参数。

更新: 我希望该方法可以推广到多个参数。

示例: 我想根据 2 个字典中的优先级对字符串列表进行排序。所以我需要使用那些优先级字典来对列表进行排序。

我想要类似的东西:

sorted(myList, key=sortingAlgorithm(priorityDictionary1, priorityDictionary2), reverse=True) 

如果我将优先级字典设置为全局变量,则可以做到这一点,然后我不需要将它作为排序算法的参数。但是,我希望能够在没有全局变量的情况下做到这一点。

如果这是不可能的,你能推荐一下pythonic的方法吗?

提前致谢。

【问题讨论】:

  • 你知道函数可以返回函数,对吧?
  • 您的代码中的sortingAlgorithm() 是什么? sorted() 函数有自己的排序算法,它需要的指令是与其他项目相比,每个项目应该去哪里。 Key= 需要是“一个接受列表项并返回数字/字符串/可排序值的函数”。随着答案的出现,有很多方法可以解决这个问题 - 但没有一种方法涉及传递排序算法来排序......
  • 两个值是结合在一起还是第二个是决胜局?
  • @PadraicCunningham 两个值合并
  • @Hossam,所以dict1[x] + dict2[x]dict2[dict1[x]]?

标签: python sorting


【解决方案1】:

试试key=priorityDictionary.get

get 是字典上的一个方法,它接受一个键并返回一个值(如果找到的话)。

编辑:上述解决方案适用于单个dict 的情况。这是一个概括,其中priorityDict2 的值是priorityDict1 的键。

而且,正如 Padriac Cunningham 指出的那样,您可以使用 lambda 使用嵌套字典进行排序:

output = sorted(myList, key=lambda element: priorityDict1[priorityDict2[element]])

【讨论】:

  • 哦,对了——我以为我们需要一个比较器,但这里不是这样。
  • 感谢您的回答,但您能查看我的更新吗?
  • @Hossam 在这种情况下你想对tuples 进行字典排序吗?
  • @YakymPirozhenko 不,我想使用两个字典中的值并将它们合并到一个函数中,该函数返回应该用于排序的值。
  • @YakymPirozhenko 谢谢。
【解决方案2】:

使用闭包。

def something(foo):
  def somethingsomething(bar):
    return foo(bar)
  return somethingsomething

baz = something(len)
print baz('quux')

【讨论】:

    【解决方案3】:

    代码-

    priorities = {'xyz' : 1, 'cde' : 3, 'abc' : 4, 'pqr' : 2}
    
    arr = ['abc', 'cde', 'pqr', 'xyz', 'cde', 'abc']
    
    arr.sort(key = lambda s : priorities[s])
    
    print(arr)
    

    输出 -

    ['xyz', 'pqr', 'cde', 'cde', 'abc', 'abc']
    

    【讨论】:

      【解决方案4】:

      一些稍微独立的例子:

      stringList = ["A1", "B3", "C2", "D4"]
      priorityDict = {"A1": 1, "B3": 3, "C2": 2, "D4": 4}
      
      # Reference an accessor function
      print sorted(stringList, key=priorityDict.get)
      
      # Provide a lambda function (with "free" closure)
      print sorted(stringList, key=lambda x: priorityDict[x])
      
      # Provide a normal function (helper definition needs scope visibility 
      # on priority dict, but doesn't have to be global - you can define 
      # functions in the scope of other functions a little like lambdas)
      def myKey(x):
          return priorityDict[x]
      
      print sorted(stringList, key=myKey)
      

      【讨论】:

        【解决方案5】:

        如果你想将一个字典中的值作为键传递给下一个字典,你需要一个函数或一个 lambda:

        l = ["foo", "Foo", "Bar", "bar", "foobar", "Foobar"]
        
        d1 = {"f": 1, "F": 0, "b": 1, "B": 0}
        d2 = {1: 10, 0: 20}
        print(sorted(l, key=lambda x: d2[d1[x[0]]]))
        

        如果某个键可能不存在,您仍然可以使用 get:

        sorted(l, key=lambda x: d2.get(d1.get(x[0], {}), some_default))
        

        只需确保 some_default 有意义并且可以与其他值进行比较。

        【讨论】:

          【解决方案6】:
          def sortingAlgorithm(primaryDictionary):
            def __cmp__(a, b):
              pass # do something with a, b, and primaryDictionary here
            return __cmp__
          

          【讨论】:

            猜你喜欢
            • 2016-03-16
            • 2017-02-10
            • 2011-07-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-10-25
            相关资源
            最近更新 更多