복붙노트

[PYTHON] "튜플 목록"을 평면 목록 또는 행렬로 변환합니다.

PYTHON

"튜플 목록"을 평면 목록 또는 행렬로 변환합니다.

Sqlite를 사용하면 "select..from"명령이 "output"결과를 반환합니다.이 결과는 (Python으로) 인쇄됩니다.

>>print output
[(12.2817, 12.2817), (0, 0), (8.52, 8.52)]

그것은 튜플리스트 인 것 같습니다. 나는 하나의 간단한 1D 배열 (= 파이썬에서의리스트)에서 "출력"을 변환하고 싶습니다.

[12.2817, 12.2817, 0, 0, 8.52, 8.52]

또는 2x3 매트릭스 :

12.2817 12.2817
0          0 
8.52     8.52

"output [i] [j]"를 통해 읽을 수 있습니다.

flatten 명령은 첫 번째 옵션에 대한 작업을 수행하지 않으며 두 번째 옵션에 대해서는 전혀 모르고 있습니다. :)

나에게 힌트를 주시겠습니까? 실제 데이터가 훨씬 커지면 빠를 수 있습니다 (여기에는 단순한 예가 있습니다).

해결법

  1. ==============================

    1.지금까지 가장 빠른 (그리고 가장 짧은) 해결책이 게시되었습니다 :

    지금까지 가장 빠른 (그리고 가장 짧은) 해결책이 게시되었습니다 :

    list(sum(output, ()))
    

    itertools 솔루션보다 약 50 % 빠르며 맵 솔루션보다 약 70 % 빠릅니다.

  2. ==============================

    2.Python 3에서는 * 구문을 사용하여 반복 가능한 목록을 평평하게 만들 수 있습니다.

    Python 3에서는 * 구문을 사용하여 반복 가능한 목록을 평평하게 만들 수 있습니다.

    >>> t = [ (1,2), (3,4), (5,6) ]
    >>> t
    [(1, 2), (3, 4), (5, 6)]
    >>> import itertools
    >>> list(itertools.chain(*t))
    [1, 2, 3, 4, 5, 6]
    >>> 
    
  3. ==============================

    3.itertools 체인을 사용하십시오 :

    itertools 체인을 사용하십시오 :

    >>> import itertools
    >>> list(itertools.chain.from_iterable([(12.2817, 12.2817), (0, 0), (8.52, 8.52)]))
    [12.2817, 12.2817, 0, 0, 8.52, 8.52]
    
  4. ==============================

    4.또는 다음과 같이 목록을 병합 할 수 있습니다.

    또는 다음과 같이 목록을 병합 할 수 있습니다.

    reduce(lambda x,y:x+y, map(list, output))
    
  5. ==============================

    5.반복 가능한 유형으로 작동하는 목록 이해 방법은 여기에 나와있는 다른 방법보다 빠릅니다.

    반복 가능한 유형으로 작동하는 목록 이해 방법은 여기에 나와있는 다른 방법보다 빠릅니다.

    flattened = [item for sublist in l for item in sublist]
    

    l은 평평하게하는 목록입니다 (OP의 경우 출력이라고 함)

    l = list(zip(range(99), range(99)))  # list of tuples to flatten
    
    [item for sublist in l for item in sublist]
    

    시간 측정 결과 = 루프 당 7.67 μs ± 129 ns

    flattened = []
    list(flattened.extend(item) for item in l)
    

    시간 결과 = 루프 당 11 μs ± 433 ns

    list(sum(l, ()))
    

    시간 결과 = 루프 당 24.2 μs ± 269 ns

  6. ==============================

    6.큰 배열의 합계 옵션보다 빠른 다른 옵션 :

    큰 배열의 합계 옵션보다 빠른 다른 옵션 :

    지도 / 확장으로 평면화 :

    l = []
    list(map(l.extend, output))
    

    지도 대신 목록 이해력으로 병합 (빠름)

    l = []
    list(l.extend(row) for row in output)
    

    업데이트 : 목록을 반복자로 사용하지 않고 확장이 가능 하나 이해력없이 병합 (가장 빠름)

    이것에 대한 다음 답을 확인한 후에는 목록 수정 (이중 조정)을 통해 더 빠른 솔루션을 제공했는데, 약간 조정 해 봤지만 이제는 목록의 실행 (...)이 시간의 큰 부분을 드래그하고 나서 단순한 루프에 대한 목록 이해가 조금 더 면도되었습니다. 최종 해결책은 다음과 같습니다.

    l = []
    for row in output: l.extend(row)
    
  7. ==============================

    7.

    >>> flat_list = []
    >>> nested_list = [(1, 2, 4), (0, 9)]
    >>> for a_tuple in nested_list:
    ...     flat_list.extend(list(a_tuple))
    ... 
    >>> flat_list
    [1, 2, 4, 0, 9]
    >>> 
    

    위에 표시된 것처럼 튜플 목록에서 단일 목록으로 쉽게 이동할 수 있습니다.

  8. ==============================

    8.임의의 중첩 목록의 경우 (경우를 대비하여) :

    임의의 중첩 목록의 경우 (경우를 대비하여) :

    def flatten(lst):
        result = []
        for element in lst: 
            if hasattr(element, '__iter__'):
                result.extend(flatten(element))
            else:
                result.append(element)
        return result
    
    >>> flatten(output)
    [12.2817, 12.2817, 0, 0, 8.52, 8.52]
    
  9. ==============================

    9.데이터 구조와 속도면에서 numpy가 만들어진 것입니다.

    데이터 구조와 속도면에서 numpy가 만들어진 것입니다.

    import numpy as np
    
    output = [(12.2817, 12.2817), (0, 0), (8.52, 8.52)]
    output_ary = np.array(output)   # this is your matrix 
    output_vec = output_ary.ravel() # this is your 1d-array
    
  10. from https://stackoverflow.com/questions/10632839/transform-list-of-tuples-into-a-flat-list-or-a-matrix by cc-by-sa and MIT license