2009-11-17 9 views
4

Ce qui suit est mon code python:python réduire l'erreur?

>>> item = 1 
>>> a = [] 
>>> a.append((1,2,3)) 
>>> a.append((7,2,4)) 
>>> sums=reduce(lambda x:abs(item-x[1]),a) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: <lambda>() takes exactly 1 argument (2 given) 
>>> 

Comment puis-je résoudre ce problème? Merci!

+1

Veuillez noter que 'sum' est une fonction intégrée dans python, il est donc recommandé d'utiliser un nom différent, comme je l'ai fait dans ma réponse. – abyx

+0

J'ai changé la somme en sommes, et la même erreur apparaît. –

+0

Oui, bien sûr. Les réponses ci-dessous expliquent ce qu'est le vrai problème. Je viens de dire que c'est une meilleure pratique pour maintenant ombrer la fonction «sum» :) – abyx

Répondre

8

Votre lambda prend un seul argument, mais reduce requiert une fonction qui prend deux arguments. Fais que ton lambda prenne deux arguments.

Puisque vous ne dites pas ce que vous voulez ce code à faire, je vais deviner:

the_sum=reduce(lambda x,y:abs(y[1]-x[1]),a) 
2

reduce attend la fonction qu'il est donnée d'accepter 2 arguments. Pour chaque élément de l'itérable, il passera la fonction de l'élément actuel et la valeur de retour précédente de la fonction. Donc, pour la somme d'une liste est reduce(lambda: x,y: x+y, l, 0)

Si je comprends bien, pour obtenir le comportement que vous essayez d'obtenir, changer le code:

a_sum = reduce(lambda x,y: x + abs(item-y[1]), a, 0) 

Mais je peux me tromper sur ce que vous essayaient d'obtenir. De plus amples informations sont dans la docstring de la fonction reduce.

3

Votre problème en lui-même est un peu flou. Quoi qu'il en soit, j'ai pris juste assumption--

>>> a = [] 
>>> a.append((1,2,3)) 
>>> a.append((7,2,4)) 
>>> a 
[(1, 2, 3), (7, 2, 4)] # list of tuples 

Je suppose que vous pourriez être intéressé à obtenir la somme de tous les éléments de la liste. Si tel est le problème, alors cela pourrait être résolu en 2 étapes

1) La première étape devrait être d'aplatir la liste.

2) Ensuite, ajoutez tous les éléments de la liste.

>>> new_list = [y for x in a for y in x] # List comprehension used to flatten the list 
[1, 2, 3, 7, 2, 4] 
>>> sum(new_list) 
19 

Une doublure

>>> sum([y for x in a for y in x]) 
19 

Une autre hypothèse, si votre problème est de moins tous les éléments de tuple par élément dans la liste puis utilisez ceci:

>>> [tuple(map(lambda y: abs(item - y), x)) for x in a] 
[(0, 1, 2), (6, 1, 3)] # map function always returns a list so i have used tuple function to convert it into tuple. 

Si le problème est quelque chose d'autre alors s'il vous plaît élaborer.

PS: Python La compréhension de liste est bien meilleure et efficace que toute autre chose.