Lambda函数Python3输出没有变化


def salary_sort(thing):
    def importantparts(thing):
        for i in range(1, len(thing)):
            a=thing[i].split(':')
            output = (a[1],a[0],a[8])
            sortedlist = sorted(output, key = lambda item: item[2], reverse=True)
            print(sortedlist)
    return importantparts(thing)
salary_sort(employee_data)

这个函数应该按照人名的薪水对他们进行排序。我设法分离出他们的姓和薪水,但我似乎无法按他们的薪水进行排序

'Thing'又名employee_data

employee_data = ["FName  LName   Tel      Address  City   State  Zip   Birthdate   Salary",
"Arthur:Putie:923-835-8745:23 Wimp Lane:Kensington:DL:38758:8/31/1969:126000",
"Barbara:Kertz:385-573-8326:832 Ponce  Drive:Gary:IN:83756:12/1/1946:268500",
"Betty:Boop:245-836-8357:635 Cutesy Lane:Hollywood:CA:91464:6/23/1923:14500",.... etc.]

输出
['Putie', 'Arthur', '126000']
['Kertz', 'Barbara', '268500']
['Betty', 'Boop', '14500']
['Hardy', 'Ephram', '56700']
['Fardbarkle', 'Fred', '780900']
['Igor', 'Chevsky', '23400']
['James', 'Ikeda', '45000']
['Cowan', 'Jennifer', '58900']
['Jesse', 'Neal', '500']
['Jon', 'DeLoach', '85100']
['Jose', 'Santiago', '95600']
['Karen', 'Evich', '58200']
['Lesley', 'Kirstin', '52600']
['Gortz', 'Lori', '35200']
['Corder', 'Norma', '245700']

您的代码存在许多问题,但关键的问题是您在创建时对每一行进行排序,而不是对列表的列表进行排序。

:

  • importantparts()不返回任何东西(因此salarysort()返回None)。

  • 您需要将Salary字段转换为int,以便按值正确排序(它们并不都具有相同的字段宽度,因此字母数字排序将不正确)。

  • 最后,您不需要使用for i in range(1, len(thing)):,您可以直接迭代thing,取一个切片来删除第一个元素1

1请注意,最后一个本身并没有错,但是直接在可迭代对象上迭代被认为更"python化"。

def salary_sort(thing):
    def importantparts(thing):
        unsortedlist = []
        for item in thing[1:]:
            a=item.split(':')
            unsortedlist.append([a[1],a[0],int(a[8])])
        print unsortedlist
        sortedlist = sorted(unsortedlist, key = lambda item: item[2], reverse=True)
        return (sortedlist)
    return importantparts(thing)
employee_data = ["FName  LName   Tel      Address  City   State  Zip   Birthdate   Salary",
                 "Arthur:Putie:923-835-8745:23 Wimp Lane:Kensington:DL:38758:8/31/1969:126000",
                 "Barbara:Kertz:385-573-8326:832 Ponce  Drive:Gary:IN:83756:12/1/1946:268500",
                 "Betty:Boop:245-836-8357:635 Cutesy Lane:Hollywood:CA:91464:6/23/1923:14500"]

print salary_sort(employee_data)
输出:

[['Kertz', 'Barbara', 268500], ['Putie', 'Arthur', 126000], ['Boop', 'Betty', 14500]]

您的主要问题是使用每个新的重置output序列,而不是先累积数据然后排序。另一个问题是,你的外部函数声明了一个内部函数并调用了它,但是内部函数没有返回任何东西。最后,如果您对字符串进行排序而不将其转换为整数,您将得到一个字母数字排序:('9','81','711','6'),这可能不是您所期望的。

顺便说一下,外部-内部函数模式在这里没有用,你可以使用一个简单的直接函数。
def salary_sort(thing):
    output = []
    for i in range(1, len(thing)):
        a=thing[i].split(':')
        output.append([a[1],a[0],a[8]])
    sortedlist = sorted(output, key = lambda item: int(item[2]), reverse=True)
    return sortedlist

结果如预期:

[['Kertz', 'Barbara', '268500'], ['Putie', 'Arthur', '126000'], ['Boop', 'Betty', '14500']]

如果你更喜欢用数字来表示薪水,你可以把转换做得更高一步:

def salary_sort(thing):
    output = []
    for i in range(1, len(thing)):
        a=thing[i].split(':')
        output.append([a[1],a[0],int(a[8])])
    sortedlist = sorted(output, key = lambda item: item[2], reverse=True)
    return sortedlist

,结果也是正确的:

[['Kertz', 'Barbara', 268500], ['Putie', 'Arthur', 126000], ['Boop', 'Betty', 14500]]

问题是您根据工资值而不是整个数组对单个元素(即['Putie', 'Arthur', '126000'])进行排序。

另外,由于您想对薪水进行排序,您必须将它们强制转换为int,否则将使用字母排序。

你可以看一下以下内容:

def salary_sort(thing):
    def importantparts(thing):
        data = []
        for i in range(1, len(thing)):
            a=thing[i].split(':')
            output = (a[1],a[0],int(a[8]))
            data.append(output)
        data.sort(key=lambda item: item[2], reverse=True)
        return data
    return importantparts(thing)
employee_data = ["FName  LName   Tel      Address  City   State  Zip   Birthdate   Salary", 
"Arthur:Putie:923-835-8745:23 Wimp Lane:Kensington:DL:38758:8/31/1969:126000", 
"Barbara:Kertz:385-573-8326:832 Ponce  Drive:Gary:IN:83756:12/1/1946:268500", 
"Betty:Boop:245-836-8357:635 Cutesy Lane:Hollywood:CA:91464:6/23/1923:14500"]
print(salary_sort(employee_data))

如预期的那样:

[('Kertz', 'Barbara', 268500), ('Putie', 'Arthur', 126000), ('Boop', 'Betty', 14500)]

我在这里所做的是将员工的所有相关数据推入一个新数组(名为data),然后使用lambda函数对该数组进行排序。

最新更新