이미지의 백분율 차이가 작은 경우 (즉, 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)
당신은 세트를 구축 시도 할 수 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
순서가 틀리며 'i1, i2'가 존재하지 않습니다. 그들을 액세스하려고합니다. 'set (itertools.chain (* it (t) for it.combinations (images_list, 2) if diff (* t))))' –
왜''(이미지) - 속이? 나쁜 이름의 속임수에 이미 고유 한 집합이 있습니다. 실제로 오류를 일으키는 라인은 무엇입니까? 해시 가능하지 않은 Image.Open 객체를 해시하려고합니다. –