<질문>
목록 목록에서 각 하위 목록의 첫 번째 항목을 추출하여 새 목록에 추가하는 가장 좋은 방법이 무엇인지 궁금합니다. 따라서 내가 가지고 있는 경우:
lst = [[a,b,c], [1,2,3], [x,y,z]]
그리고, 뽑고 싶다a
,1
그리고x
그리고 그것들과 별도의 목록을 만드십시오.
나는 시도했다:
lst2.append(x[0] for x in lst)
<답변1>
>>> 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, '엑스']
도움이 되었기를 바랍니다! 감사해요!
'개발 > Python' 카테고리의 다른 글
[파이썬] 반복 변수를 수정해도 후속 반복에 영향을 주지 않는 이유 (0) | 2023.08.12 |
---|---|
[파이썬] XML 파일을 pandas 데이터 프레임으로 변환하는 방법 (0) | 2023.08.12 |
[파이썬] 스크립트 출력 창을 열어 두는 방법 (0) | 2023.08.12 |
[파이썬] 1D 배열의 실행 평균을 계산하는 SciPy 함수 또는 NumPy 함수? (0) | 2023.08.12 |