Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从值元组创建lambda函数_Python_Python 3.x - Fatal编程技术网

Python 如何从值元组创建lambda函数

Python 如何从值元组创建lambda函数,python,python-3.x,Python,Python 3.x,基本目标是根据内部列表中的字段对列表列表进行排序。因此,我有下面的Python代码来实现这一点: import sys def sort_cleaned_data(data, fields=None): if not isinstance(fields, tuple): raise ValueError("Argument to the function has to be a tuple") else: if all(list(map(lamb

基本目标是根据内部列表中的字段对列表列表进行排序。因此,我有下面的Python代码来实现这一点:

import sys

def sort_cleaned_data(data, fields=None):
    if not isinstance(fields, tuple):
        raise ValueError("Argument to the function has to be a tuple")
    else:
        if all(list(map(lambda x:isinstance(x, int), fields))):
            sorted_data = sorted(data, key=lambda x:(x[2],x[1]))
            return sorted_data
        else:
            raise ValueError("All the values inside the fields tuple have to be integers")


data = [
["John", 34, 2],
["Ashley", 30, 2],
["Peter", 28, 5],
["Bill", 29, 5],
["Jennifer", 65, 4],
["Laura", 33, 3]
]
try:
    sorted_data = sort_cleaned_data(data, fields=(2,1))
except ValueError as e:
    print(e)
    sys.exit(1)

for d in sorted_data:
    print(d)
在函数sort_cleaned_data中,我有字段元组,其中包含要排序的内部数组的字段。因此,我必须根据字段列表动态生成函数:
key=lambda x:(x[2],x[1])

我认为Python中的eval就是这种情况,但我不确定如何做到这一点。有人能帮我吗

非常感谢。

使用理解:

sorted(data, key=lambda x: tuple(x[i] for i in fields))

现在,
字段的大小和值可以是任意的,只要
x
(内部列表)有足够的元素不引起indexer。

您让它变得比必须的复杂得多:

def sort_cleaned_data(data, fields):
    return sorted(data, key=lambda x: (x[fields[0]], x[fields[1]]))


data = [
["John", 34, 2],
["Ashley", 30, 2],
["Peter", 28, 5],
["Bill", 29, 5],
["Jennifer", 65, 4],
["Laura", 33, 3]
]

sorted_data = sort_cleaned_data(data, fields=(2,1))
for d in sorted_data:
    print(d)

这太复杂了。只需使用
operator.itemgetter
创建键函数

import operator
def sort_cleaned_data(data, fields=None):
   return sorted(data, key=operator.itemgetter(*fields))

data = [
["John", 34, 2],
["Ashley", 30, 2],
["Peter", 28, 5],
["Bill", 29, 5],
["Jennifer", 65, 4],
["Laura", 33, 3]
]

sorted_data = sort_cleaned_data(data, fields=(2,1))
for d in sorted_data:
    print(d)
输出:

['Ashley', 30, 2]
['John', 34, 2]
['Laura', 33, 3]
['Jennifer', 65, 4]
['Peter', 28, 5]
['Bill', 29, 5]