Próbuję zrozumieć działanie wbudowanej funkcji {X0}}, ale parametr start odparowała mój umysł:

  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
    

Jestem po prostu oszołomiony przez to i nie mam pojęcia, co się dzieje. Oto, co ma do powiedzenia Dokumenty Pythona: http://docs.Python.org/library /Funkcje.html#sum. Nie daje tego żadnego wyjaśnienia "Co jeśli początek nie jest ciągiem, a nie całkowitym?"

6
GodMan 30 sierpień 2012, 21:28

3 odpowiedzi

Najlepsza odpowiedź

Suma ma coś takiego

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

sum([1,2],[3,4]) rozszerza coś takiego jak [3,4] + 1 + 2, które można zobaczyć, aby zobaczyć, aby dodawać liczby i listy razem.

Aby użyć sum, aby produkować listy, wartości powinny być listą list, podczas gdy start może być tylko listą. Zobaczysz w twoich błędnych przykładach, że lista zawiera co najmniej pewne ints, a następnie wszystkie listy.

Zwykły przypadek, w którym możesz pomyśleć o wykorzystaniu sumy z listami, aby przekonwertować listę list na listę

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

Ale naprawdę nie powinieneś tego robić, jak będzie powolny.

19
Winston Ewert 30 sierpień 2012, 18:45
a=[[1, 20], [2, 3]]
b=[[[[[[1], 2], 3], 4], 5], 6]
sum(b, a)

Ten błąd nie ma nic wspólnego z parametrem startowym. Na liście są dwa elementy b. Jednym z nich jest [[[[[1], 2], 3], 4], 5], drugi jest 6, a lista i Int nie można dodać razem.

sum(a, b)

To jest dodawanie:

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

Który działa dobrze (jak tylko dodawasz listy do list).

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

To próbuje dodać [3,4] + 1 + 2, co znowu nie jest możliwe. Podobnie sum(b,a) jest dodawana [1, 2] + 3 + 4.

Co jeśli początek nie jest ciągiem, a nie całkowitym?

sum nie może sumować ciągów. Widzieć:

>>> 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]
5
David Robinson 30 sierpień 2012, 17:36

Jedną z rzeczy, które zostały zasugerowane, ale nie wyraźnie stwierdzone w innych odpowiedziach jest to, że wartość {x0}}} określa wartość type dla wartości powrotnej i do podsumowania elementów . Ponieważ domyślnie jest to start=0, oczywiście (i 0 to liczba całkowita), oczywiście wszystkie elementy w iterable muszą być liczbami całkowitymi (lub typami metodą __add__, która działa z liczbami całkowitymi). Inne przykłady wspomniały listy podłączenia:

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

Lub obiekty timedate.timedelta:

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

Zauważ, że oba przykłady przekazują pusty obiekt typu w iterable jako parametr początkowy, aby uniknąć błędu TypeError: unsupported operand type(s) for +: 'int' and 'list'.

3
Paveway3 27 styczeń 2017, 15:24