Lambda函数Python3输出没有变化

时间:2016-10-11 06:34:37

标签: python sorting lambda

>>> import numpy as np
>>> def mapfeature_binominal_array(x1, x2, n=6, lst=None):
...     if lst is None:
...         lst = [x1, x2]
...     if n == 1:
...         return np.array(lst)
...     else:
...         for i in range(n + 1):
...             formula = (x1 ** (n - i)) * (x2 ** i)
...             lst.append(formula)
...         return mapfeature_binominal_array(x1, x2, n - 1, lst)
...
>>> mapfeature_binominal_array(-0.25, 1.5)
array([ -2.50000000e-01,   1.50000000e+00,   2.44140625e-04,
        -1.46484375e-03,   8.78906250e-03,  -5.27343750e-02,
         3.16406250e-01,  -1.89843750e+00,   1.13906250e+01,
        -9.76562500e-04,   5.85937500e-03,  -3.51562500e-02,
         2.10937500e-01,  -1.26562500e+00,   7.59375000e+00,
         3.90625000e-03,  -2.34375000e-02,   1.40625000e-01,
        -8.43750000e-01,   5.06250000e+00,  -1.56250000e-02,
         9.37500000e-02,  -5.62500000e-01,   3.37500000e+00,
         6.25000000e-02,  -3.75000000e-01,   2.25000000e+00])

这个函数应该按工资来排序名单。 我设法隔离了姓氏和工资,但我似乎无法根据他们的工资进行排序

'东西'又名employee_data

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)

输出

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

3 个答案:

答案 0 :(得分:2)

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

此外:

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

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

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

1 请注意,这最后不是错误本身,但直接在迭代上迭代被认为更“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]]

答案 1 :(得分:1)

您的主要问题是您使用每个新的重置output序列,而不是先累积数据然后排序。另一个问题是你的外部函数声明了一个内部函数并调用它,但内部函数没有返回任何东西。最后,如果您对字符串进行排序而不将它们转换为整数,您将得到一个字母数字排序:(' 9',' 81',' 711',&#39 ; 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]]

答案 2 :(得分:0)

问题在于,您根据工资值对个人元素(意为['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函数对该数组进行排序。