2013-08-29 30 views

Odpowiedz

12
[(a, b, c) for a, (b, c) in l] 

Tuple packing and unpacking rozwiązuje problem.

+1

W jaki sposób link w odpowiedzi pomaga rozwiązać ten problem? – GreenAsJade

+2

Działa to, gdy znasz strukturę krotki, ale czasami powodem, dla którego należy ją spłaszczyć, jest struktura nieznana. na przykład np.where może zwrócić krotkę z jedną wartością lub krotką z listą wartości, w którym to przypadku krotka musi być dostępna inaczej. Jak można obsłużyć tę sytuację? – DanGoodrick

+0

@DanGoodrick: np.where nie robi tego. Krotka nigdy nie zawiera listy; zawsze jest krotką numpy tablic, a poza przypadkiem dziwnych krawędzi z 0-wymiarowymi tablicami, liczba tablic jest zawsze równa wymiarowi tablicy wejściowej. W różnych przypadkach nie ma potrzeby uzyskiwania dostępu do krotki, a spłaszczenie jej nie ma większego sensu. – user2357112

4

nowego w Pythonie 3.5 z dodatkowym krotka rozpakowaniu wprowadzony w PEP 448, można użyć wyrażenia wystąpił w literały krotka taki sposób, że można użyć

>>> l = [(50, (2.7387451803816479e-13, 219)), (40, (3.4587451803816479e-13, 220))] 
>>> [(a, *rest) for a, rest in l] 
[(50, 2.738745180381648e-13, 219), (40, 3.458745180381648e-13, 220)] 

Może to być przydatne, jeśli miał zagnieżdżone krotki używany rekordu - z wieloma elementami, które chciałbyś spłaszczyć.

1

można uzyskać wynik w ten sposób

>> example = [(50, (2.7387451803816479e-13, 219))] 
>>> [tuple(x[:1]) + (x[1]) for x in example] 
[(50, 2.738745180381648e-13, 219)] 
0

Python 2.7 kompatybilny sposób do tego, co sugeruje, Mitch dla Pythona 3.5.

>>> example = [(50, (2.7387451803816479e-13, 219)), 
      (100, (3.7387451803816479e-13, 218))] 
>>> [(lambda *x: x)(k, *r) for k, r in example] 
[(50, 2.738745180381648e-13, 219), (100, 3.7387451803816477e-13, 218)] 

Zaletą tej metody jest to, że nie trzeba, aby znaleźć nazwę zmiennej dla każdej wartości wewnętrznej krotki spłaszczania jak w przyjętym odpowiedź. Jeśli są dwa lub trzy elementy, nie stanowi to problemu, ale wyobraź sobie, że są wartości dziesiętne lub więcej ...

0

Twoja osoba może użyć poniższej funkcji i zastosować ją w pętli do każdego elementu na liście.

import type 

def flatten(T): 
    if type(T) != types.TupleType: return (T,) 
    elif len(T) == 0: return() 
    else: return flatten(T[0]) + flatten(T[1:]) 

Jak to działa:

  • Najpierw zostanie sprawdzone czy typ jest krotką, jeśli nie, to „krotki” argument
  • Druga linia zwraca pusty krotki, jeśli krotka jest pusty
  • trzecia linia wysiada pierwszy element i wywołuje funkcję rekurencyjnie

Dobrą rzeczą w tym roztworze wynosi:

  • Nie jest konieczne, aby poznać strukturę danej krotki
  • krotka można zagnieżdżać dowolnie głęboko
  • Works w Pythonie 2.7

Kod jest nieznacznie przystosowane od następującego źródła:
https://mail.python.org/pipermail/tutor/2001-April/005025.html

Mam nadzieję, że ktoś pomaga :)