각 하위 목록의 첫 번째 항목 추출


146

목록 목록에서 각 하위 목록의 첫 번째 항목을 추출하여 새 목록에 추가하는 가장 좋은 방법이 무엇인지 궁금합니다. 그래서 내가 가지고 있다면 :

lst = [[a,b,c], [1,2,3], [x,y,z]]

내가 꺼내 싶은 a, 1그리고 x그와는 별도의 목록을 만들 수 있습니다.

나는 시도했다 :

lst2.append(x[0] for x in lst)

1
코드가 거의 정확합니다. 유일한 문제는 목록 이해의 사용법입니다.
— Abhishek Mittal

답변:


198

목록 이해 사용 :

>>> lst = [['a','b','c'], [1,2,3], ['x','y','z']]
>>> lst2 = [item[0] for item in lst]
>>> lst2
['a', 1, 'x']

목록 이해 방법도 Numpy 방법보다 빠르며 빠릅니다. jboi 의 답변은 성능 비교에 대해 말합니다
— Qiao Zhang

83

당신은 우편 번호를 사용할 수 있습니다 :

>>> lst=[[1,2,3],[11,12,13],[21,22,23]]
>>> zip(*lst)[0]
(1, 11, 21)

또는 zip목록을 생성하지 않는 Python 3 :

>>> list(zip(*lst))[0]
(1, 11, 21)

또는,

>>> next(zip(*lst))
(1, 11, 21)

또는 (내가 가장 좋아하는) numpy를 사용하십시오.

>>> import numpy as np
>>> a=np.array([[1,2,3],[11,12,13],[21,22,23]])
>>> a
array([[ 1,  2,  3],
       [11, 12, 13],
       [21, 22, 23]])
>>> a[:,0]
array([ 1, 11, 21])

다운 보트하지 않았지만 첫 번째 코드 스 니펫 (zip)은 " 'zip'오브젝트를 첨자화할 수 없습니다."를 생성합니다. Jupyter의 Python 3.6.
— jboi

@ jboi : 그냥 감싸 list거나 사용하십시오 next. 감사합니다
— dawg

20

같은 문제가 있었고 각 솔루션의 성능에 대해 궁금했습니다.

여기 있습니다 %timeit:

import numpy as np
lst = [['a','b','c'], [1,2,3], ['x','y','z']]

배열을 변환하는 첫 번째 numpy-way :

%timeit list(np.array(lst).T[0])
4.9 µs ± 163 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

목록 이해 (@alecxe에서 설명)를 사용하는 완전히 기본 :

%timeit [item[0] for item in lst]
379 ns ± 23.1 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

zip@dawg가 설명하는 다른 기본 방법 :

%timeit list(zip(*lst))[0]
585 ns ± 7.26 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

두 번째 numpy-way. 또한 @dawg에 의해 설명되었습니다 :

%timeit list(np.array(lst)[:,0])
4.95 µs ± 179 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

놀랍게도 (적어도 나에게는) 목록 이해를 사용하는 기본 방법은 numpy-way보다 빠르며 약 10 배 빠릅니다. 마지막없이 두 개의 numpy-way를 실행 list하면 약 1µs가 절약되며 이는 여전히 10 배 차이입니다.

각 코드 스 니펫을에 대한 호출로 둘러 쌀 때 len생성기가 끝까지 실행되도록 타이밍이 동일하게 유지되었습니다.


4
배열을 만들 때 상당한 오버 헤드가 있습니다.
— hpaulj

1
hnumj에 동의하십시오. numpy 배열로 시작하면 [:, 0]이 더 빠릅니다. lst = np.array ([[ 'a', 'b', 'c'], [1,2,3], [ 'x', 'y', 'z']])), 그런 다음 lst [:, 0]. 예제 타임 트라이얼에서의 변환은 목록 이해에 불공평 한 이점을 제공합니다. 따라서 가능한 경우 속도가 궁극적 목표라면 numpy 배열을 사용하여 데이터를 저장하십시오. Numpy는 거의 항상 빠릅니다. 속도를 위해 만들어졌습니다.
— spacedustpi

13

Python에는 itemgetter라는 함수가 포함되어있어 목록의 특정 색인에있는 항목을 반환합니다.

from operator import itemgetter

검색하려는 항목의 색인을 itemgetter () 함수에 전달하십시오. 첫 번째 항목을 검색하려면 itemgetter (0)을 사용합니다. 이해해야 할 중요한 것은 itemgetter (0) 자체가 함수를 반환한다는 것입니다. 해당 함수에 목록을 전달하면 특정 항목이 나타납니다.

itemgetter(0)([10, 20, 30]) # Returns 10

이것은 함수를 첫 번째 인수로 사용하는 list (또는 다른 반복 가능)를 두 번째 인수로 사용하는 map ()과 결합 할 때 유용합니다. iterable에서 각 객체에 대해 함수를 호출 한 결과를 반환합니다.

my_list = [['a', 'b', 'c'], [1, 2, 3], ['x', 'y', 'z']]
list(map(itemgetter(0), my_list)) # Returns ['a', 1, 'x']

map ()은 제너레이터를 반환하므로 결과는 실제 목록을 얻기 위해 list ()로 전달됩니다. 요약하면 다음과 같이 작업을 수행 할 수 있습니다.

lst2.append(list(map(itemgetter(0), lst)))

이것은 목록 이해를 사용하기위한 대체 방법이며 컨텍스트, 가독성 및 선호도에 따라 크게 선택할 수 있습니다.

추가 정보 : https://docs.python.org/3/library/operator.html#operator.itemgetter


2

코드가 거의 정확합니다. 유일한 문제는 목록 이해의 사용법입니다.

다음과 같이 사용하면 (lst에서 x의 경우 x [0]) 생성기 객체를 반환합니다. 다음과 같이 사용하면 [x에서 lst의 경우 [x [0]] 목록을 반환합니다.

목록 이해 결과를 목록에 추가하면 목록 이해 결과는 목록의 단일 요소입니다.

lst = [["a","b","c"], [1,2,3], ["x","y","z"]]
lst2 = []
lst2.append([x[0] for x in lst])
print lst2[0]

lst2 = [[ 'a', 1, 'x']]

lst2 [0] = [ 'a', 1, 'x']

내가 틀렸다면 알려주십시오.


1
lst = [['a','b','c'], [1,2,3], ['x','y','z']]
outputlist = []
for values in lst:
    outputlist.append(values[0])

print(outputlist) 

산출: ['a', 1, 'x']


0

기존 목록이 있다고 말했습니다. 그래서 나는 그것으로 갈 것입니다.

>>> lst1 = [['a','b','c'], [1,2,3], ['x','y','z']]
>>> lst2 = [1, 2, 3]

현재 생성기 객체를 두 번째 목록에 추가하고 있습니다.

>>> lst2.append(item[0] for item in lst)
>>> lst2
[1, 2, 3, <generator object <genexpr> at 0xb74b3554>]

그러나 아마도 첫 번째 항목의 목록이되기를 원할 것입니다.

>>> lst2.append([item[0] for item in lst])
>>> lst2
[1, 2, 3, ['a', 1, 'x']]

이제 첫 번째 항목 목록을 기존 목록에 추가했습니다. 항목 자체가 아닌 항목 자체를 기존 항목에 추가하려면 list.extend를 사용합니다. 이 경우 확장 프로그램은 생성기를 사용하여 현재 목록을 확장하기 위해 생성기를 사용하여 각 항목을 추가하므로 걱정할 필요가 없습니다.

>>> lst2.extend(item[0] for item in lst)
>>> lst2
[1, 2, 3, 'a', 1, 'x']

또는

>>> lst2 + [x[0] for x in lst]
[1, 2, 3, 'a', 1, 'x']
>>> lst2
[1, 2, 3]

https://docs.python.org/3.4/tutorial/datastructures.html#more-on-lists https://docs.python.org/3.4/tutorial/datastructures.html#list-comprehensions


1
귀하의 답변은 OP가 원하는 것처럼 들리고 완벽 하지만 append질문 의 단어 가 혼란을 초래 한다고 생각합니다 . 그것은 단순히 솔루션의 목록 이해 부분을 원하는 것처럼 들립니다.
— beroe
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.