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


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.