2010-01-26 6 views
21

나는 파이썬에서 목록을 가지고 있으며이를 통해 반복하고, 현재 k 번째 요소를 제외한 모든 요소를 ​​포함하는 목록을 선택적으로 구성하고 싶습니다. 내가 할 수있는 한 가지 방법은 다음과 같습니다.k 번째 요소가없는 목록을 효율적이고 비파괴 적으로 가져 오는 것

l = [('a', 1), ('b', 2), ('c', 3)] 
for num, elt in enumerate(l): 
    # construct list without current element 
    l_without_num = copy.deepcopy(l) 
    l_without_num.remove(elt) 

그러나 이것은 비효율적이며 우아하지 않습니다. 그것을 할 수있는 쉬운 방법이 있습니까? note 참고 현재 요소를 제외하는 원래 목록의 조각을 가져 오려고합니다. 이 작업을 쉽게 수행 할 수있는 것처럼 보입니다.

귀하의 도움에 감사드립니다.

+0

나는 다음과 같이이 일을 생각하는 또 다른 방법 : #이 k는 가정 제외 할 요소 필터 (lambda x : x [0]! = k, l) 이게 존경할만한가요? 더 좋은 방법이 있습니까? – user248237dfsf

+0

예상되는 결과가 무엇인지 설명해 주시겠습니까? "NameError : '복사'이름이 정의되지 않았습니다." – Pepijn

+2

이 작업의 결과가 무엇인지 알 수 없습니다. 귀하가 게시 한 구현은 원래 목록의 3 가지 사본을 사용하지 않지만 세 가지 요소가 누락되었습니다. 목표를 명확히 할 수 있습니까? –

답변

53
l = [('a', 1), ('b', 2), ('c', 3)] 
k = 1 
l_without_num = l[:k] + l[(k + 1):] 

이게 원하는가요?

+2

+1, 확실히 머리와 어깨가 가장 좋습니다! 왜 슬라이스하고 연결할 수있을 때 반복합니까? -) –

+0

이 작업은 모든 k Beefster

8

사용 방법을 더 설명하면 도움이됩니다. 그러나 목록 이해력으로도 같은 일을 할 수 있습니다.

l = [('a', 1), ('b', 2), ('c', 3)] 
k = 1 
l_without_num = [elt for num, elt in enumerate(l) if not num == k] 

l_without_num에 저장할 필요가없는 경우 반복하는 것이 더 효율적입니다.

0

아마도 가장 효율적인 것은 아니지만 필자의 기능 프로그래머가이 글을 쓸 것입니다.

import operator 
from itertools import * 
def inits(list): 
    for i in range(0, len(list)): 
     yield list[:i] 
def tails(list): 
    for i in range(0, len(list)): 
     yield list[i+1:] 
def withouts(list): 
    return imap(operator.add, inits(list), tails(list)) 

for elt, without in izip(l, withouts(l)): 
    ... 

import functools, operator 
for elt in l: 
    without = filter(functools.partial(operator.ne, elt), l) 

나는 그것을 할 수있는 권리 것은 생각하지 않습니다,하지만 짧은입니다. :-)

세트에 차이 연산자를 사용
+0

거기에 ifilter가 있어야할까요? :) –

+0

downvoters 의견을 올리시겠습니까? 첫 번째 해결책은 결과 및 알고리즘 복잡성과 관련하여 앞선 답과 동일합니다. – ephemient

2
l=[('a', 1), ('b', 2), ('c', 3)] 
k=1 
l_without_num=l[:] # or list(l) if you prefer 
l_without_num.pop(k) 
1
#!/bin/bash 
`python -c "'\n'.join(mylist[:])" 2>NULL | sed '/mybadelement/d'` 

0

:

list(set(l).difference([l[k]]) 

l=[('a', 1), ('b', 2), ('c', 3)] 
list(set(l).difference([l[1]])) 
[('a', 1), ('c', 3)] 
관련 문제