2015-11-05 7 views
16

私は、リストを展開したい場合は、私は以下のような方法を見つけた:組み込み関数sumはsum(list、[])と何をするのですか?

>>> a = [[1, 2], [3, 4], [5, 6]] 
>>> a 
[[1, 2], [3, 4], [5, 6]] 
>>> sum(a, []) 
[1, 2, 3, 4, 5, 6] 

私はこれらの行に何が起こったのか知っている、とthe documentation状態はありません:

sum(iterable[, start])

Sums start and the items of an iterable from left to right and returns the total. start defaults to 0 . The iterable's items are normally numbers, and the start value is not allowed to be a string.

For some use cases, there are good alternatives to sum() . The preferred, fast way to concatenate a sequence of strings is by calling ''.join(sequence) . To add floating point values with extended precision, see math.fsum() . To concatenate a series of iterables, consider using itertools.chain() .

New in version 2.3.

ないあなたはスタートは数字でなければならないと思いますか?なぜ[]と書くことができますか?

(sum(a, [])) 

答えて

22

Don't you think that start should be a number?

startデフォルトで、数です。 0、あなたが引用したドキュメントごとに。したがって、あなたは、例えば:やるとき

sum((1, 2)) 

それは0 + 1 + 2として評価され、それが3等しく、誰もが幸せです。あなたが別の番号から開始したい場合は、その代わりに供給することができます:、とても良い

>>> sum((1, 2), 3) 
6 

これまでのところ。


しかし、リストのようなあなたが上+を使用することができます他のものがある:

>>> ['foo'] + ['bar'] 
['foo', 'bar'] 

あなたはこのためsumを使用しようとするが、しかし、同じ結果を期待して、あなたはTypeErrorを取得します:

>>> sum((['foo'], ['bar'])) 

Traceback (most recent call last): 
    File "<pyshell#2>", line 1, in <module> 
    sum((['foo'], ['bar'])) 
TypeError: unsupported operand type(s) for +: 'int' and 'list' 

0 + ['foo'] + ['bar']です。

この問題を解決するには、start[]と入力してください。[] + ['foo'] + ['bar']となり、すべて正常です。だから、答えるために:

Why [] can be written here?

を数にstartデフォルトものの、それはの一つであることがを持っていないからです。他のものも追加することができます。それは現在のように、のものに便利です。

+1

'sum'は実際に文字列を拒否するようにコード化されています。 – interjay

+0

@interjayちょっと、OPを編集してそれに応じて修正したときに見つけた – jonrsharpe

+0

良い答えは、新しい何かを学びました:それはエラーをタイプエラー:sum()は文字列を合計することはできません[ ) – Noxeus

5

実はsum機能は、反復可能なすべての項目で各反復におけるstart__add__属性を呼び出します。例えば

>>> [].__add__([2,3]) 
[2, 3] 
#OR 
>>> [] + [1,2,3] 
[1, 2, 3] 

そして、この場合、結果はlists.Actuallyそれは以下の処理を行い、アルゴリズムの視点であなたの入力の連結リストのようになります。

>>> a = [[1, 2], [3, 4], [5, 6]] 
>>> start = [] 
>>> for i in a: 
...  start += i 
... 
>>> start 
[1, 2, 3, 4, 5, 6] 

ないこと__add__属性を持つオブジェクトの各シーケンスに対してsum関数を呼び出すことができます。ただし、オブジェクトが整数でない場合は、デフォルトのstart引数は0です。 TypeErrorを挙げてください。この場合、関数には適切なstartを指定する必要があります。

>>> class newObj(object): 
... def __init__(self,val): 
...   self.val = val 
... def __add__(self,item): 
...  return '{}_____{}'.format(self.val,item) 
... 
>>> 
>>> start=newObj('new_obj') 
>>> 
>>> start 
<__main__.newObj object at 0x7f75f9241c50> 
>>> 
>>> start + 5 
'new_obj_____5' 
>>> 
>>> 
>>> sum(['1','2','3'],start) 
'new_obj_____123' 
+0

ありがとう、私はそれを理解していると思います。 :-) –

2

startは、最初の引数として指定したiterableの内容で合計されます。 sumは、追加のさまざまなケースを可能にするためにtypestartをintに制限しません。

a = [[1, 2], [3, 4], [5, 6]] 
sum(a, number) 

大雑把に変換します:

基本的に合計がこのような何かをし

リスト a内のすべての値は、この作品一覧や、以前の合計、拡大し、ルックスがあるので
number += every value in the list a 

number + [1, 2] + [3, 4] + [5, 6] 

と入力するとintlistの追加が許可されていないため、これは残念ながらTypeErrorになります。あなたがリスト[]を入力した場合

1 + [1, 2] == I hope you like TypeErrors 

はしかし、単に一緒にaの要素を結合し、平らに私たちが知っているリストと愛をもたらすことが起こっています。

startの値のデフォルトは0intです。これは、合計の最も一般的なケースが算術演算であるためです。

+1

ありがとう、私はそれを理解していると思います。 :-) –