2012-08-30 9 views
6

estoy tratando de comprender el funcionamiento de la incorporada en el sum() función, pero, el parámetro start se ha evaporado mi mente:pitón función suma - `start` explicación parámetro requerido

  1. a=[[1, 20], [2, 3]] 
    b=[[[[[[1], 2], 3], 4], 5], 6] 
    >>> sum(b,a) 
    Traceback (most recent call last): 
        File "<stdin>", line 1, in <module> 
    TypeError: can only concatenate list (not "int") to list 
    >>> sum(a,b) 
    [[[[[[1], 2], 3], 4], 5], 6, 1, 20, 2, 3] 
    
  2. >>> a=[1,2] 
    >>> b=[3,4] 
    >>> sum(a,b) 
    Traceback (most recent call last): 
        File "<stdin>", line 1, in <module> 
    TypeError: can only concatenate list (not "int") to list 
    >>> sum(b,a) 
    Traceback (most recent call last): 
        File "<stdin>", line 1, in <module> 
    TypeError: can only concatenate list (not "int") to list 
    

Estoy estupefacto por esto y no tengo ni idea de lo que está sucediendo. Esto es lo que los documentos de Python tienen que decir: http://docs.python.org/library/functions.html#sum. Esto no da ninguna explicación sobre '¿y si el inicio no es una cadena y no un número entero?'

+0

Utilizo el argumento 'start' solo para las sumas acumuladas y el tipo es solo' int'. No creo que esté destinado a casos tan patológicos :) – halex

+0

Como se indica en los documentos: restrinja 'suma' a los números :-) tendrá menos dolores de cabeza. Haga algunas construcciones explícitas si tiene que concatenar listas anidadas; de todos modos, tendrá un código más fácil de mantener. – jsbueno

Respuesta

14

Suma hace algo como esto

def sum(values, start = 0): 
    total = start 
    for value in values: 
     total = total + value 
    return total 

sum([1,2],[3,4]) expande algo así como [3,4] + 1 + 2, que se puede ver intentos para agregar números y listas juntas.

Para usar sum para producir listas, los valores deben ser una lista de listas, mientras que el inicio puede ser simplemente una lista. Verá en sus ejemplos anómalos que la lista contiene al menos algunas entradas, en lugar de todas las listas.

El caso habitual en la que podría pensar en utilizar listas con suma es convertir una lista de listas en una lista

sum([[1,2],[3,4]], []) == [1,2,3,4] 

Pero en realidad no debería hacer eso, ya que va a ser lento.

+0

más como 'total = total + valor' que es por lo que sum tiene un rendimiento cuadrático para las listas –

+0

@gnibbler, eso es cierto. No había pensado en eso. –

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

Este error no tiene nada que ver con el parámetro de inicio. Hay dos elementos en la lista b. Uno de ellos es [[[[[1], 2], 3], 4], 5], el otro es 6, y una lista y int no se pueden agregar juntos.

sum(a, b) 

Esta es la adición:

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

que funciona muy bien (como estás añadiendo listas de listas).

a=[1,2] 
b=[3,4] 
sum(a,b) 

Esto está tratando de agregar [3,4] + 1 + 2, que de nuevo no es posible. Del mismo modo, sum(b,a) está agregando [1, 2] + 3 + 4.

¿Qué sucede si el inicio no es una cadena y no es un número entero?

sum can not sum strings. Ver:

>>> sum(["a", "b"], "c") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: sum() can't sum strings [use ''.join(seq) instead] 
1

Una de las cosas que se ha insinuado, pero no se indica explícitamente en las otras respuestas es que el valor start define el type para el valor de retorno y por los conceptos que se resume. Como el valor predeterminado es start=0, (y 0 es un número entero, por supuesto) todos los elementos en el iterable deben ser enteros (o tipos con un método __add__ que funciona con enteros).Otros ejemplos han mencionado listas concatenación:

(sum([[1,2],[3,4]], []) == [1,2,3,4])

o timedate.timedelta objetos:

(sum([timedelta(1), timedelta(2)], timedelta()) == timedelta(3)).

Observe que ambos ejemplos pasan un objeto vacío del tipo en el iterable como el parámetro de inicio para evitar la obtención de un error TypeError: unsupported operand type(s) for +: 'int' and 'list'.

Cuestiones relacionadas