홀수 위치에서 목록 요소 추출


100

그래서 기존 목록의 하위 목록 인 목록을 만들고 싶습니다.

예를 들면

L = [1, 2, 3, 4, 5, 6, 7], 홀수 위치 에 있는 모든 요소 lili포함 하는 하위 목록을 만들고 싶습니다 L.

내가 할 수있는 동안

L = [1, 2, 3, 4, 5, 6, 7]
li = []
count = 0
for i in L:
    if count % 2 == 1:
        li.append(i)
    count += 1

그러나 동일한 작업을 더 적은 수의 단계로 효율적으로 수행 할 수있는 다른 방법이 있는지 알고 싶습니다.


@WaleedKhan : 왜 질문에 이해력을 나열해야합니까?
Tamara Wijsman 2012 년

1
@TomWijsman : 목록 내포 . ETA : 무시하십시오 : 나는 주위를 뒤져서 당신이 농담하고 있다는 것을 나타내는 당신의 대답을 발견 했습니다 . 다음에 웃는 얼굴을 넣어!
David Robinson

2
@DavidRobinson :하지만 다른 사람들은 두 개의 모호한 단어로 그가 의미하는 바를 OP가 명확하지 않을 수도 있다고 말할 수 있습니다. 댓글을 달고 여기 저기 찔러서 사람들이 더 나은 콘텐츠를 준비하고 작성하도록합니다. 와 ... :) 영업 또는 방문자 단서를 떠나 피하기 위해
타마라 Wijsman에게

답변:


229

해결책

그래 넌 할수있어:

l = L[1::2]

그리고 이것이 전부입니다. 결과는 다음 위치에 배치 된 요소를 포함합니다 ( 0기반이므로 첫 번째 요소는 position에 0, 두 번째 요소는 1등).

1, 3, 5

따라서 결과 (실제 숫자)는 다음과 같습니다.

2, 4, 6

설명

[1::2]끝은 목록 슬라이스의 표기법입니다. 일반적으로 다음과 같은 형식입니다.

some_list[start:stop:step]

생략 start하면 기본값 ( 0)이 사용됩니다. 따라서 첫 번째 요소 ( 0인덱스가 0기반 이므로 위치 )가 선택됩니다. 이 경우 두 번째 요소가 선택됩니다.

두 번째 요소가 생략 되었기 때문에 기본값이 사용됩니다 (목록의 끝). 따라서 목록은 두 번째 요소에서 끝까지 반복 됩니다 .

세 번째 인수 ( step) 도 제공했습니다 2. 즉, 한 요소가 선택되고 다음 요소는 건너 뜁니다.

요약하자면이 경우 [1::2]는 다음을 의미합니다.

  1. 두 번째 요소를 가져옵니다 (그런데 색인에서 판단하면 이상한 요소입니다).
  2. 하나의 요소를 건너 뜁니다 (이 때문에 기본값 step=2인 것과 반대로 하나를 건너 뜁니다 step=1).
  3. 다음 요소를 취하고
  4. 2 ~ 3 단계를 반복합니다. 목록 끝에 도달 할 때까지

편집 : @PreetKukreti는 Python의 목록 슬라이싱 표기법에 대한 또 다른 설명에 대한 링크를 제공했습니다. 여기를보세요 : Python의 슬라이스 표기법 설명

기타-카운터 교체 enumerate()

코드에서 명시 적으로 카운터를 만들고 늘립니다. Python에서는 다음을 사용하여 반복 가능한 일부를 열거 할 수 있으므로 필요하지 않습니다 enumerate().

for count, i in enumerate(L):
    if count % 2 == 1:
        l.append(i)

위의 내용은 사용했던 코드와 정확히 동일한 용도로 사용됩니다.

count = 0
for i in L:
    if count % 2 == 1:
        l.append(i)
    count += 1

forPython에서 카운터 를 사용하여 루프 를 에뮬레이트하는 방법에 대해 자세히 알아보기 : Python 'for'루프에서 인덱스 액세스


볼 @TomWijsman 이해 파이썬 슬라이싱 구문에 대한 질문
Preet Kukreti에게

질문은 이상한 위치를 요구합니다. 이것은 균등 한 위치를 제공합니다 (0,2,4,6). 영업 이익은 지수 원처럼 소리 (1,3,5)가 주어질 것이다 [1,2,3,4,5,6,7][1::2].
Marcin 2012 년

@Marcin : 예, 실제로 동일한 결론을 내 렸습니다 (수정 참조). 이것은 OP의 코드를주의 깊게 읽은 후에 나왔습니다. 이 문제는 인덱싱에 대한 다른 기반에서 발생했습니다 (나에게 " 이상한 "요소는 첫 번째 요소를 의미 하고 OP의 경우 번째 요소 이므로에서 인덱싱 됨 1).
Tadeck

1
@TomWijsman : 죄송합니다. 당신이 무엇을 변경했는지 알아 차리지 못했습니다. 실제로 링크가 있지만 Python의 list슬라이싱이 아닌 Numarray 프로젝트로 연결됩니다 . 특히 list의 슬라이스가 원래 목록에 대한 참조를 유지하지 않기 때문에 약간 다릅니다 .copy(). 그러나 일부 독자에게 더 좋은 것을 갖는 것이 좋습니다. 댓글에이 링크를 추가해 주시면 찬성 투표를 할 수 있으며 답변 바로 아래에 표시됩니다.
Tadeck

@Tadeck "Odd numbered indexes"는 매우 자연스럽게 홀수 인 인덱스를 의미합니다.
Marcin 2012 년

12

를 들어 홀수 위치, 당신은 아마 원하는 :

>>>> list_ = list(range(10))
>>>> print list_[1::2]
[1, 3, 5, 7, 9]
>>>>

3

나는 그들의 Math (Set) 구문 때문에 List comprehensions를 좋아합니다. 그래서 이것에 대해 :

L = [1, 2, 3, 4, 5, 6, 7]
odd_numbers = [y for x,y in enumerate(L) if x%2 != 0]
even_numbers = [y for x,y in enumerate(L) if x%2 == 0]

기본적으로 목록을 열거하면 색인 x과 값을 얻을 수 y있습니다. 내가 여기서하는 일은 y출력 목록 (짝수 또는 홀수)에 값 을 넣고 인덱스 x를 사용하여 해당 지점이 홀수인지 확인하는 것입니다 ( x%2 != 0).


1
enumerate (items) 대신 enumerate (L)이어야하지 않습니까?
ab123

0

비트 AND 연산자를 사용할 수 있습니다 &. 아래를 보자 :

x = [1, 2, 3, 4, 5, 6, 7]
y = [i for i in x if i&1]
>>> 
[1, 3, 5, 7]

비트 AND 연산자는 1과 함께 사용되며, 그 이유는 바이너리로 쓰여진 홀수는 첫 번째 숫자가 1이어야하기 때문입니다.

23 = 1 * (2**4) + 0 * (2**3) + 1 * (2**2) + 1 * (2**1) + 1 * (2**0) = 10111
14 = 1 * (2**3) + 1 * (2**2) + 1 * (2**1) + 0 * (2**0) = 1110

1을 사용한 AND 연산은 값이 홀수 인 경우 1 만 반환합니다 (2 진수의 1도 마지막 숫자 1을 가짐).

자세한 내용은 Python Bitwise Operator 페이지를 확인하세요 .

추신 : 데이터 프레임에서 홀수 및 짝수 열을 선택하려는 경우이 방법을 전술적으로 사용할 수 있습니다. 얼굴 키 포인트의 x 및 y 좌표가 x1, y1, x2 등의 열로 주어 졌다고 가정 해 봅시다. x 및 y 좌표를 각 이미지의 너비 및 높이 값으로 정규화하려면 간단히 수행 할 수 있습니다.

for i in range(df.shape[1]):
    if i&1:
        df.iloc[:, i] /= heights
    else:
        df.iloc[:, i] /= widths

이것은 질문과 정확히 관련이 없지만 데이터 과학자 및 컴퓨터 비전 엔지니어에게는이 방법이 유용 할 수 있습니다.

건배!


-1

list_ = list (range (9)) print (list_ [1 :: 2])


간단한 설명과 함께 대답하고 적절한 형식의 코드 블록을 넣으십시오. 감사합니다
벤 카타 krishnan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.