목록에서 요소 제외 [중복]

Nov 15 2020

슬라이스를 사용할 수 있지만 목록의 특정 요소에 사용할 수 있습니까? 예를 들어 두 번째 요소를 제외한 전체 목록을 인쇄 a = [1,2,3,4,5,6,7,8,9]하는 for루프 를 만들고 싶습니다 .

나는 다음과 같이 만들고 싶다.

for i in a[something_slice]: 
    print(i)

이것이 가능한가?

답변

1 NotGaeL Nov 15 2020 at 19:57

하나의 요소 만 제외 lst[:i] + lst[i + 1:]하는 경우 @ Applet123에서 제안한 2 슬라이스 접근 방식이 아마도 가장 빠를 것입니다 (또는 excluded = lst.pop(1)제외 된 요소를 추출 for x in lst: print(x)하고 다른 요소 를 모두 인쇄 한 다음 lst.insert(1,excluded)제외 된 요소를 목록에 다시 넣는 것입니다. 데이터 구조 문서 참조). 세부).

특정 인덱스를 필터링하고 싶다면 for 루프 대신 목록 이해 및 열거를 기반으로 한 더 비단뱀적이고 직관적 인 접근 방식을 사용하는 것이 좋습니다 .

myList = [1,2,3,4,5,6,7,8,9]
excludedIndices = [1]
myFilteredList = [x for i, x in enumerate(myList) if i not in excludedIndices]
print (myFilteredList)

# output:
# [1,3,4,5,6,7,8,9]

# or, to actually print each element individually:
for x in myFilteredList:
  print (x)

# which can also work as a 2-liner with inline filtering:
for i, x in enumerate(myList):
  if i not in excludedIndices: print(x)

또한 필터 및 맵 내장 함수 의 파이썬 사용을 확인하십시오. 이 목적으로는 과도 할 수 있지만 여전히 이러한 종류의 처리에 대해 일반적이고 더 강력한 솔루션을 제공합니다.

# filters an enumerated element 
def myFilter(element): 
  return element[0] not in excludedIndices

# maps an enumerated element to a function 
def myMap(element): 
  print(element[1])
  
# runs myMap function for each enumerated element on the list filtered by myFilter
for x in map(myMap,filter(myFilter,enumerate(myList))): pass

람다 식을 사용하여 한 줄로 바꿀 수도 있습니다 .

for x in map(lambda x: print(x[1]),filter(lambda x: x[0] not in excludedIndices,enumerate(myList))): pass
AmitKumar Nov 15 2020 at 19:53

enumerate ()를 사용하여 슬라이스하지 않고 할 수 있습니다.

index_to_skip=1
for idx,item in enumerate(a):
    if idx!=index_to_skip:
        print(item)
Aplet123 Nov 15 2020 at 19:53

실제로 목록을 슬라이스하려면 2 개의 슬라이스를 사용하여 그 주위를 슬라이스 할 수 있습니다.

def exclude(lst, i):
    return lst[:i] + lst[i + 1:]

exclude([1, 2, 3, 4, 5], 1) # [1, 3, 4, 5]

그냥 반복하고 싶다면, 인덱스가 건너 뛰고 싶은 값에 도달하면 건너 뛸 수도 있습니다.

for i, v in enumerate(a):
    if i == 1:
        continue
    print(v)