2011-08-13 5 views
2

나는 두 개의 큰 목록이 설정합니다보다 효율적인 방법은

a = [['abcdefghijklmno', 'foo', 'bar'], … ] 
b = [['abcdefghij12345', 'foo', 'bar'], … ] 

내가 해당 b에 진입, 그 반대가없는 a의 모든 구성원에 관심이 있어요, 모두 nab에 대해 a[n][0]b[n][0]을 비교 한 결과를 바탕으로합니다. 나는이 두 가지 하위 목록 항목을 만들어서 set_a.difference(set_b)을 수행 할 수 있으며 그 반대로도 매우 빠릅니다. 그러나 ab의 나머지 항목에 따라 두 목록 작성 (아마도 분명)는 느린 : ls 인 하나 또는 abyz와 위에서 설명 된 두 가지이다

def remaining(ls ,y, z): 
    return [i for i in ls if i[0] in y.difference(z)] 

.

답변

2

을 내가 테스트 용의자.. 목록에서 각 요소에 대해 y.difference를 호출합니다. 이것을보십시오 :

def remaining(ls, y, z): 
    diff = y.difference(z) 
    return filter(lambda i: i[0] in diff, ls) 
+0

10k 개 항목 목록에 대한 테스트가 거의 즉시 이루어졌습니다. 아마도 좀 더 철저히 테스트해야 하겠지만, 당신의 의심은 옳은 것처럼 보일 것입니다. – urschrei

1

적어도 def remaining(ls ,y, z):def remaining(ls, common_set):에서 다시 작성해야 키로 예를 들어 사용 (이 속도를 a[0]와 dicts 및 b[0] 값을 ab의 구조를 다시 생각에서 어떤 점이 있나요?.

하면 다음 아이디어를 고려 (아마 __slots__와) 객체에 ['abcdefghijklmno', 'foo', 'bar']을 포장 만 'abcdefghijklmno' 값을 사용하여 __hash__ 정의는 set(a) - set(b)을 할 수있을 것입니다 후 것을 당신이 해결 작업을 얻을

+0

Hah! 절대로 나에게 일어난 일이 아니다. – urschrei

+1

그냥 교차로가 필요하지 않니? –

+0

@ 기계의 즐거움. –