programing

Python으로 개체 목록에서 중복 제거

padding 2023. 10. 5. 21:15
반응형

Python으로 개체 목록에서 중복 제거

객체 목록도 있고 기록이 가득한 데이터베이스도 있어요개체 목록에 제목 속성이 있으며 중복된 제목이 있는 개체는 목록에서 제거합니다(원본 그대로).

그런 다음 개체 목록에 데이터베이스의 레코드가 중복되어 있는지 확인하고, 그런 경우 해당 항목을 목록에서 제거한 후 데이터베이스에 추가합니다.

다음과 같은 목록에서 중복을 제거하는 솔루션을 확인했습니다.myList = list(set(myList)), 물건 목록으로 어떻게 해야 할지 모르겠어요?

저는 제 물건 목록의 순서도 유지해야 합니다.그리고 내가 그들을 이용할 수 있을 것도 생각하고 있었습니다.difflib제목에 차이가 있는지 확인합니다.

set(list_of_objects)중복이 무엇인지 알고 있는 경우에만 중복을 제거합니다. 즉, 개체의 고유성을 정의해야 합니다.

그러려면 개체를 해시 가능하게 만들어야 합니다.둘 다 정의해야 합니다.__hash__그리고.__eq__방법은 다음과 같습니다.

http://docs.python.org/glossary.html#term-hashable

하지만, 당신은 아마도 당신이 다음과 같은 것을 정의하기만 하면 될 것입니다.__eq__방법.

EDIT: 구현 방법__eq__방법:

제가 말씀드린 것처럼 대상의 고유한 정의를 알아야 합니다.저자명과 제목의 속성을 가진 책이 있다고 가정할 때, 이 책들의 조합은 독특합니다. (따라서, 우리는 스티븐 킹이 쓴 많은 책들과 The Shining이라는 이름의 많은 책들을 가질 수 있지만, The Shining by Stephen King이라는 이름의 단 한 권의 책만 가질 수 있습니다.) 구현은 다음과 같습니다.

def __eq__(self, other):
    return self.author_name==other.author_name\
           and self.title==other.title

마찬가지로, 이것은 때때로 제가 구현하는 방법입니다.__hash__방법:

def __hash__(self):
    return hash(('title', self.title,
                 'author_name', self.author_name))

동일한 저자와 제목을 가진 2권의 책 목록을 만들면 책 개체가 동일(연산자 사용)하고 동일(사용)함을 확인할 수 있습니다.==연산자).또한 언제set()사용하면 책 한 권을 제거할 수 있습니다.

편집: 이것은 내 오래된 답변 중 하나이지만, 나는 그것이 마지막 단락에서 스트라이크 스루로 수정된 오류를 가지고 있다는 것을 이제야 알아차렸습니다: 같은 개체들.hash()양보하지 않을True와 비교하면is. 그러나 개체의 해시 기능은 집합의 요소로 사용하거나 사전에서 키로 사용하려는 경우 사용됩니다.

해시가 가능하지 않기 때문에 세트를 직접 사용할 수 없습니다.제목은 그렇지만.

첫 번째 부분입니다.

seen_titles = set()
new_list = []
for obj in myList:
    if obj.title not in seen_titles:
        new_list.append(obj)
        seen_titles.add(obj.title)

어떤 데이터베이스/ORM 등을 설명해야 합니다.두 번째 파트에 쓰시는 거잖아요.

이는 아주 미미해 보입니다.

new_dict = dict()
for obj in myList:
    if obj.title not in new_dict:
        new_dict[obj.title] = obj

수 경우__eq__개체에 대해 dict-compre을 사용하여 동일한 목적을 달성할 수 있습니다.

unique = list({item.attribute:item for item in mylist}.values())

여기에는 주어진 키의 마지막 인스턴스가 포함됩니다. 예를 들어,mylist = [Item(attribute=1, tag='first'), Item(attribute=1, tag='second'), Item(attribute=2, tag='third')]은 ㅇ[Item(attribute=1, tag='second'), Item(attribute=2, tag='third')]를 할 수 .mylist[::-1](전체 목록이 있는 경우).

해시할 수 없는 유형의 경우 사전 이해력을 사용하여 모든 개체의 필드를 기준으로 중복 개체를 제거할 수 있습니다.이 기능은 해시 가능한 유형을 기본적으로 지원하지 않는 Pydantic에 특히 유용합니다.

{ row.title : row for row in rows }.values()

서는 을 둔 합니다.row.title, 그리고 마지막으로 일치하는 개체를 다음과 같이 사용할 것입니다.row.title, 수 즉, 행의 제목은 같지만 다른 특성의 값은 다를 수 있습니다.

를 들면 [{"title": "test", "myval": 1}, {"title": "test", "myval": 2}] ==> [{"title": "test", "myval": 2}]

에서 여러 row이것을 더할 수 .

{ f"{row.title}\0{row.value}" : row for row in rows }.values()

가 null입니다.\0필드 사이의 구분자로 사용됩니다.은 null에 null 합니다.row.title아니면row.value.

둘다요.__hash__그리고.__eq__이것을 위해서 필요합니다.

__hash__python의 집합은 해시 테이블로 구현되므로 집합에 개체를 추가하기 위해 필요합니다.기본적으로 숫자, 문자열 및 튜플과 같은 불변 개체는 해시 가능합니다.

그러나 비둘기 구멍 원리로 인해 해시 충돌(두 개의 다른 물체가 동일한 값으로 해시됨)은 피할 수 없습니다.만으로 두 할 수 다를 __eq__기능.따라서 사용자가 제공하는 실제 해시 함수는 중요하지 않지만 성능을 위해 해시 충돌을 피하는 것이 최선입니다(_hash__()를 구현하는 정확하고 좋은 방법은 무엇입니까?).

저는 최근에 아래 코드를 사용하게 되었습니다.목록 위에서 반복적으로 보고 있는 내용을 기록한 다음 이미 본 항목을 제거하지만 중복 목록을 만들지 않고 원래 목록에서 항목을 삭제하기 때문에 다른 답변과 유사합니다.

seen = {}
for obj in objList:
    if obj["key-property"] in seen.keys():
        objList.remove(obj)
    else:
        seen[obj["key-property"]] = 1

원래 주문을 보존하려면 다음을 사용합니다.

seen = {}
new_list = [seen.setdefault(x, x) for x in my_list if x not in seen]

주문에 관심이 없는 경우 다음을 사용합니다.

new_list = list(set(my_list))

꽤 쉬운 친구네요 :-

a = [5,6,7,32,32,32,32,32,32]

a = 리스트(set(a))

프린트(a)

[5,6,7,32]

그게 다에요! :)

언급URL : https://stackoverflow.com/questions/4169252/remove-duplicates-in-list-of-object-with-python

반응형