46

リスト内包表記を使用して sum() のようなものをエミュレートすることは可能ですか?

たとえば、リスト内のすべての要素の積を計算する必要があります。

list = [1, 2, 3]
product = [magic_here for i in list]

#product is expected to be 6

同じことをしているコード:

def product_of(input):
   result = 1
   for i in input:
      result *= i
   return result
4

10 に答える 10

48

いいえ; リスト内包表記は、入力と同じ長さのリストを生成します。シーケンスを単一の値に折りたたむには、Python の他の関数ツールのいずれか (特にreduce()この場合)が必要です。

于 2013-05-19T06:49:37.290 に答える
44
>>> from functools import reduce
>>> from operator import mul
>>> nums = [1, 2, 3]
>>> reduce(mul, nums)
6

Python 3 ハック

などのアプローチに関して、[total := total + x for x in [1, 2, 3, 4, 5]]

これはひどい考えです。リスト内包表記を使用してエミュレートするという一般的な考え方はsum()、リスト内包表記の目的全体に反します。この場合、リスト内包表記を使用しないでください。

Python 2.5 / 2.6 ハック

Python では2.5/現在作成中のリスト内包表記を参照するために2.6使用できます。vars()['_[1]']これは恐ろしく決して使用すべきではありませんが、質問で述べたものに最も近いものです(リストコンプを使用して製品をエミュレートします)。

>>> nums = [1, 2, 3]
>>> [n * (vars()['_[1]'] or [1])[-1] for n in nums][-1]
6
于 2013-05-19T06:46:06.610 に答える
33

から始まり、代入式 (PEP 572) ( operator)Python 3.8の導入により、リスト内包表記内で変数を使用およびインクリメントして、リストをその要素の合計に減らすことができます。:=

total = 0
[total := total + x for x in [1, 2, 3, 4, 5]]
# total = 15

これ:

  • 変数total0
  • 項目ごとに、代入式を介してtotal現在ループされている項目 ( ) によってインクリメントされますtotal := total + x
于 2019-04-28T13:24:23.023 に答える
15

リスト内包表記は常に別のリストを作成するため、それらを組み合わせて使用​​することはできません (たとえば、1 つの数値を与える場合など)。また、非常に卑劣でない限り、リスト内包表記で割り当てを行う方法はありません。

リスト内包表記が sum メソッドに役立つと思うのは、リストに特定の値のみを含めたい場合、または数値のリストがない場合だけです。

list = [1,2,3,4,5]
product = [i for i in list if i % 2 ==0] # only sum even numbers in the list
print sum(product)

または別の例":

# list of the cost of fruits in pence
list = [("apple", 55), ("orange", 60), ("pineapple", 140), ("lemon", 80)]
product = [price for fruit, price in list]
print sum(product)

リスト内包表記で割り当てを行う非常に卑劣な方法

dict = {"val":0}
list = [1, 2, 3]
product = [dict.update({"val" : dict["val"]*i}) for i in list]
print dict["val"] # it'll give you 6!

...しかし、それは恐ろしいです:)

于 2013-05-19T07:04:27.307 に答える
9

このようなもの:

>>> a = [1,2,3]
>>> reduce(lambda x, y: x*y, a)
6
于 2013-05-19T07:32:49.550 に答える
3
>>> reduce(int.__mul__,[1,2,3])
6

C:\Users\Henry>python -m timeit -s "" "reduce(int.__mul__,range(10000))" 
1000 loops, best of 3: 910 usec per loop

C:\Users\Henry>python -m timeit -s "from operator import mul" "reduce(mul,range(10000))"
1000 loops, best of 3: 399 usec per loop

C:\Users\Henry>
于 2013-05-19T07:10:07.853 に答える
0

リスト内包表記でラムダを使用することで実現できます リスト内包表記では値を割り当てることができないため、ラムダを使用します

解決:

>>> (lambda number_list, sum=0:[sum for number in number_list for sum in [sum + number]][-1])([1, 2, 3, 4, 5])
>>> 15
于 2018-07-25T05:52:18.920 に答える