본문 바로가기
개발/Python

[파이썬] 각 하위 리스트의 첫 번째 항목 추출

by MinorMan 2023. 8. 12.
반응형

<질문>

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

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

그리고, 뽑고 싶다a,1그리고x그리고 그것들과 별도의 목록을 만드십시오.

나는 시도했다:

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

<답변1>

사용list comprehension:

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

<답변2>

zip을 사용할 수 있습니다.

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

또는 Python 3 여기서zip목록을 생성하지 않습니다.

>>> 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])

<답변3>

동일한 문제가 있었고 각 솔루션의 성능이 궁금했습니다.

여기가 있습니다%timeit:

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

배열을 변환하는 첫 번째 numpy 방식:

%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 방식보다 약 10배 더 빠릅니다. 최종 없이 두 개의 numpy-way 실행list여전히 10배 차이인 약 1µs를 절약합니다.

각 코드 스니펫을len, Generator가 끝까지 실행되도록 하기 위해 타이밍은 동일하게 유지되었습니다.


<답변4>

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

from operator import itemgetter

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

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

이는 첫 번째 인수로 함수를 사용하고 두 번째 인수로 목록(또는 다른 반복 가능한 항목)을 사용하는 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


<답변5>

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

like: (x[0] for x in lst)를 사용하면 생성기 개체가 반환됩니다. [x[0] for x in lst]와 같이 사용하면 목록이 반환됩니다.

목록 내포 출력을 목록에 추가하면 목록 내포의 출력은 목록의 단일 요소입니다.

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']

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


<답변6>

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

print(outputlist) 

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


<답변7>

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

>>> 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,  at 0xb74b3554>]

하지만 아마도 첫 번째 항목의 목록이 되기를 원할 것입니다.

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

이제 기존 목록에 첫 번째 항목 목록을 추가했습니다. 목록이 아닌 항목 자체를 기존 항목에 추가하려면 list.extend를 사용합니다. 이 경우 우리는 생성기 추가에 대해 걱정할 필요가 없습니다. 왜냐하면 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-listshttps://docs.python.org/3.4/tutorial/datastructures.html#list-comprehensions


<답변8>

아래와 같이 목록 목록에서 새 목록으로 첫 번째 값을 추출할 수 있습니다.

list_of_lists = [
    ['John', 'Anna'], [36, 24], ['Male', 'Female']
] 
           
new_list = [list[0] for list in list_of_lists] # Here

print(new_list) # ['John', 36, 'Male']

또는:

list_of_lists = [
    ['John', 'Anna'], [36, 24], ['Male', 'Female']
] 
           
new_list = [first for [first, second] in list_of_lists] # Here

print(new_list) # ['John', 36, 'Male']

<답변9>

내가 제안할 수 있는 다른 대답은

lst = [['a','b','c'], [1,2,3], ['x','y','z']]
new_lst=[lst[0][0],lst[1][0],lst[2][0]]
print(new_lst)

출력은 다음과 같습니다

['아', 1, '엑스']

도움이 되었기를 바랍니다! 감사해요!

728x90

댓글