2016-09-26 3 views
0

이미지의 백분율 차이가 작은 경우 (즉, True를 반환하고 비교 된 이미지를 2 개 생성 한 경우) 중복되는 경우 PIL 이미지가 (2 이상)이고 기능이 diff (im1, im2)입니다. 중복 된 이미지가없는 PIL 목록을 얻으려면 어떻게해야합니까? (예 : 3 개의 동등한 태양 이미지와 2 개의 이미지 이미지가있는 경우 태양 이미지 1 개와 고양이 이미지 1 개만 필요합니다)? 필자는 필터 사용을 원했지만 하나의 함수로 목록의 요소를 필터링했지만 필자의 경우 비교 함수 만 있습니다.이 목록에서 쌍으로 작동하는 비교 함수를 사용하여 목록에서 요소를 필터링하는 방법은 무엇입니까?

upd1 : 내가 코드를 시도 제안 AChampion로했습니다

import itertools as it 

dupes = {i for i in (i1, i2) for i1, i2 in it.combinations(images_list, 2) if diff(i1, i2)} 
set(images_list) - dupes 

을하지만, 파이썬 3.5 나가서 설명하자면 NameError 말한다 : 이름 'I1'가 정의되지 않은, 꽤, 또한 그것을 이해할 수 없었다

upd2 : 그래서이 코드를 수정하여 중첩 된 목록을 만들었는데,이 모든 코드는 "평평하게"(그리고이 모든 것들이 제대로 작동하는지는 확실하지 않지만), 그렇지만 이제는 얻을 수 있습니다. TypeEr ROR : unhashable 유형 : - :

for url in images_urls: 
    images.append(Image.open(requests.get(url, stream=True).raw)) 

dupes = [[i for i in (i1, i2)] for i1, i2 in it.combinations(images, 2) if diff(i1, i2)] 
dupes = [item for sublist in dupes for item in sublist] 
dupes = set(dupes) 
images = set(images) - dupes 

upd3 : @Padraic 커닝햄과 같은 내가있어 제안 :

'JpegImageFile'
문자열 이미지 = 설정 (이미지)

예제 코드를 속는

for url in images_urls: 
    print('downloading url:', url) 
    images.append(Image.open(requests.get(url, stream=True).raw)) 

dupes = set(itertools.chain(*(t for t in itertools.combinations(images, 2) if diff(*t)))) 
images = set(images) - dupes 

하지만 여전히 형식 오류를 받고 : unhashable 종류 : 어쩌면 'JpegImageFile' re는 해시/eq 방식을 사용하지 않고이 작업을 수행하는보다 쉬운 방법일까요? 내가 { '꽃', '고양이'}이 필요하지만, 내가 {지고있어 '꽃 : upd4 - 지금 나는 ... 해시/EQ 실현 방법을 자세히보고

을 다할 것입니다 '}

import itertools 
def diff(a, b): 
    return a == b 
images_list = [ 
    'flower', 
    'cat', 
    'flower' 
] 
some_values = set(itertools.chain(*(t for t in itertools.combinations(images_list, 2) if diff(*t)))) 
print(some_values) 
+0

당신은 세트를 구축 시도 할 수 http://stackoverflow.com/questions/3942303/how-does-a : 나는 더 문제 설명을 반영하기 위해 테스트를 유사성은 diff보다는 평등 테스트를 변경 한 -python-set-check-two-objects-are-equal-what-methods-does-an-o 및 http://stackoverflow.com/questions/와 같이 이미지를 저장하는 새 오브젝트에 __hash__ 및 __eq__ 메소드를 작성합니다. 3942303/no-do-a-python-set-check-two-objects-are-equal-what-methods-do-an-o – Brent

+0

순서가 틀리며 'i1, i2'가 존재하지 않습니다. 그들을 액세스하려고합니다. 'set (itertools.chain (* it (t) for it.combinations (images_list, 2) if diff (* t))))' –

+0

왜''(이미지) - 속이? 나쁜 이름의 속임수에 이미 고유 한 집합이 있습니다. 실제로 오류를 일으키는 라인은 무엇입니까? 해시 가능하지 않은 Image.Open 객체를 해시하려고합니다. –

답변

0

모든 중복 집합을 구성하고 원래 집합에서 뺍니다.

images_list = [ 
    'image red contents1', 
    'image green contents', 
    'image red contents2', 
] 
import itertools as it 
def diff(a, b): 
    return a.split()[1] == b.split()[1] 

dupes = {i2 for i1, i2 in it.combinations(images_list, 2) if diff(i1, i2)} 
set(images_list) - dupes 
# {'image green contents', 'image red contents1'} 
+0

나는 내가 시도한 텍스트를 업데이트했습니다. – Hellohowdododo

+0

죄송합니다. 잘못된 방법으로 'for'의 순서를 잘못 지정했습니다. 그러나 업데이트 된 요청에 대해 중첩 된'for '는 필요하지 않습니다. 비슷한 이미지가있는 퍼지 집합이 필요한 복사본이 적어도 하나 이상 필요한 경우 평등하다. – AChampion