Lambda函数Python3输出无变化

2024-09-30 01:18:44 发布

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

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\u 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']

Tags: outputdatadefemployeeitemsort薪水thing
3条回答

您的主要问题是用每个新的行重置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]]

问题是,您要根据salary值而不是整个数组来排序单个元素(意思是['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函数对这个数组进行排序。你知道吗

您的代码有很多问题,但关键的一点是,您在创建每一行时对它进行排序,而不是列表列表。你知道吗

此外:

  • importantparts()不返回任何内容(因此salarysort()不返回任何内容)。

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

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

1请注意,最后一个本身并不是错误的,但直接迭代iterable被认为更“Pythonic”。

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

相关问题 更多 >

    热门问题