1

Тема: Порівняння списків.

Є два списки в кожному 10500+ елементів. Кожен елемент являє собою словник з 4-ох елементів.
Хочу щоб залишилися лише унікальні елементи  з другого списку.
Стандартне

    result = (set(list_one) - set(list_thwo))

Видає помилку: TypeError: unhashable type: 'dict'
Чи є якийсь спосіб получити унікальні елементи чи треба робити то в циклі?
Дякую.

2

Re: Порівняння списків.

стандартне не може видавати помилку. вчись користуватися пошуком, щоб не задавати дурні питання. Тим більше, що тобі інтерпретатор чорним по білому написав, що не можна таке робити бо не підходить тип об'єкту. А не підходить, тому що словники не ітерабле, ферштейн?

3

Re: Порівняння списків.

ur_naz написав:

А не підходить, тому що словники не ітерабле, ферштейн?

Я розумію але там словник є елементом списку тому думав що воно не буде пробувати ітерувати кожен словник.
Але може хтось знає якусь бібліотеку для такої роботи, хоч назву далі я собі погуглю.

4

Re: Порівняння списків.

0. В чому сенс розповідати, що списків два, якщо треба лише унікальні елементи з другого? Перший список узагалі не використовується. Чи ви неправильно описали, в чому проблема.
1. Цикл буде в будь-якому разі - просто іноді його буде сховано в уже написану функцію.
2. Вам потрібно зберігати послідовність елементів?
3. Проблема в тому, що словники (і списки, і множини) передаються за посиланням і не можуть бути ключами словника. На прикладі словника:

l = [1,2]
l_ref = l #посилання
l_copy = l[:] #копія
l==l_copy1==l_ref #True, всі вони однакові
d = {l:3} #припустимо, що таке було б можливо
l_ref.append(3) #тепер змінився і l, бо словники передаються за посиланнями
l_copy==l #False, l змінився, l_copy==[1,2], l==[1,2,3]
d[l_copy]==d[l] #що тепер тут буде?

4. Ну а в цілому - напишіть функцію, що перетворює словник на щось гешоване (тобто число чи str) й однакове для тотожних словників, наприклад,

def hash(d):
    return ''.join(repr(k)+repr(v) for k,v in d.items())

і збирайте його в словник {hash(e):e for e in lst}.
values() з цього словника будуть унікальні.

Подякували: plusxx1

5

Re: Порівняння списків.

Дякую пане koala я якось так то і представляв лише вирішив запитати чи нема готової бібліотеки шоб не вигадувати ровер. А взвагалі вирішив написати для себе універсальний модуль з функцією котра буде приймати два об'єкти і порівнювати їх. Щоб можна було порівняти два списки словників та два словники списків ну і два словники словників.

6 Востаннє редагувалося koala (29.03.2020 12:04:47)

Re: Порівняння списків.

Так порівнювати - то не проблема, простий == це зробить.
Проблема в тому, що з числами не можна зробити

a==b #True
change(c) #щось інше змінили
a==b #False, бо a та b десь зачепили

а зі списками та словниками воно так і працює

7

Re: Порівняння списків.

koala написав:

Так порівнювати - то не проблема, простий == це зробить.
Проблема в тому, що з числами не можна зробити

a==b #True
c=change() #щось інше змінили
a==b #False, бо a та b десь зачепили

а зі списками та словниками воно так і працює

Я як завжди погано сформулював думку. Я хочу не порівнювати а вибирати елменти котрі знаходяться лише в одному з цих oб'єктів.
Взагалі воно мені потрібно для роботи з json об'єктами.

8

Re: Порівняння списків.

А що в dict-ах, не покажете? Може, там є поле id чи що.