2013-02-12 16 views
23

Napisałem tę funkcję, aby przekonwertować listę krotek na listę list. Czy istnieje bardziej elegancki/Pythoniczny sposób robienia tego?Konwertuj listę krotek na listę list

def get_list_of_lists(list_of_tuples): 
    list_of_lists = []               
    for tuple in list_of_tuples: 
     list_of_lists.append(list(tuple)) 

    return list_of_lists 

Odpowiedz

34

Można użyć list comprehension:

>>> list_of_tuples = [(1, 2), (4, 5)] 
>>> list_of_lists = [list(elem) for elem in list_of_tuples] 

>>> list_of_lists 
[[1, 2], [4, 5]] 
+0

Właśnie edytowałem, aby dodać link wyjaśniający listę. –

15

Choć lista zrozumienie jest całkowicie poprawny odpowiedź, jak jesteś po prostu zmieniając typ, to może być warte rozważenia Pomocniczo the map() built-in:

>>> list_of_tuples = [(1, 2), (4, 5)] 
>>> map(list, list_of_tuples) 
[[1, 2], [4, 5]] 

Wbudowany map() po prostu stosuje wywoływalne do każdego elementu danej iterable. To sprawia, że ​​jest to dobre dla tego konkretnego zadania. Ogólnie rzecz biorąc, zrozumienie list jest bardziej czytelne i wydajne (jak zrobić wszystko, co jest złożone z map() potrzebujesz lambda), ale tam, gdzie chcesz po prostu zmienić typ, map() może być bardzo jasne i szybkie.

Proszę zauważyć, że używam tutaj 2.x, więc otrzymujemy listę. W 3.x dostaniesz iterację (która jest leniwy), jeśli chcesz mieć listę w 3.x, po prostu wykonaj list(map(...)). Jeśli wszystko jest w porządku z możliwością iteracji dla twoich zastosowań, itertools.imap() zapewnia leniwy map() w 2.x.

+0

Również w Py2 'map' z/o Lambdas są szybsze niż listy-comps. :) –

+1

@BhargavRao Prawdopodobnie w znikomej ilości - o ile nie zidentyfikowałeś tego jako wąskiego gardła wydajności w swoim kodzie, czytelność zawsze powinna być priorytetem. –

+0

Zawsze myślałem, że 'mapa' jest bardziej czytelna niż lista-comp. Ale tak, różnica prędkości jest dość mała. –