4

以下は私のpythonコードです:

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

どうすれば修正できますか?ありがとう!

4

3 に答える 3

8

ラムダは引数を 1 つしか取りませんが、reduce引数を 2 つ取る関数が必要です。ラムダが 2 つの引数を取るようにします。

このコードで何をしたいのか言っていないので、次のように推測します。

the_sum=reduce(lambda x,y:abs(y[1]-x[1]),a)
于 2009-11-17T06:42:49.973 に答える
3

あなたの問題自体は少し不明確です。とにかく、私はちょうど仮定を取った--

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

リスト内のすべての要素の合計を取得することに興味があると思います。それが問題なら、それは2つのステップで解決できます

1) 最初のステップは、リストを平坦化することです。

2) そして、リストのすべての要素を追加します。

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

一発ギャグ

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

別の仮定として、問題がリスト内のアイテムごとにタプルのすべての要素を差し引くことである場合は、これを使用します。

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

問題が他の何かである場合は、詳しく説明してください。

PS: Python のリスト内包表記は、他の何よりもはるかに優れており、効率的です。

于 2009-11-17T08:14:46.153 に答える
2

reduce与えられた関数が2つの引数を受け入れることを期待しています。iterable 内のすべてのアイテムに対して、関数に現在のアイテムと、関数からの以前の戻り値を渡します。したがって、リストの合計を取得することはreduce(lambda: x,y: x+y, l, 0)

私が正しく理解している場合、取得しようとしていた動作を取得するには、コードを次のように変更します。

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

しかし、あなたが何を得ようとしているのか、私は間違っているかもしれません。詳細は、reduce関数のドキュメント文字列にあります。

于 2009-11-17T06:59:15.613 に答える