Niepowtarzające się wartości w liście zagnieżdżonej.

Niepowtarzające się wartości w liście zagnieżdżonej.
NU
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad rok
  • Postów:63
0

Cześć,

uzyskuję na wyjściu zagnieżdżoną listę jak poniższa:
[[60, 50], [30, 25], [80, 50], [40, 25]]

chcę uzyskać niepowtarzające się wartości dla każdej zagnieżdżonej na pozycji 0 i 1.
Czyli coś na kształt:
[[60, 50], [40, 25]]

Próbowałem przerobić listę główną na zbiór

            xz = set()
            for a, b in lista:
                xz.add(a)
                xz.add(b)
            for a, b in lista:
                for i in xz:
                    if a != i and b != i:
                        print(a,b)
edytowany 2x, ostatnio: nUmer
LukeJL
masz rozwalone formatowanie, nic nie można zrozumieć.
KamilAdam
  • Rejestracja:ponad 6 lat
  • Ostatnio:28 dni
  • Lokalizacja:Silesia/Marki
  • Postów:5505
1

Nie jestem dobry w pythonga, ale ten kod podobno działa:

Kopiuj
nested_list = [[60, 50], [30, 25], [80, 50], [40, 25]]

unique_firsts = list(set(x[0] for x in nested_list))
unique_seconds = list(set(x[1] for x in nested_list))

result = [[unique_firsts[i], unique_seconds[i]] for i in range(min(len(unique_firsts), len(unique_seconds)))]

print(result)

Mama called me disappointment, Papa called me fat
Każdego eksperta można zastąpić backendowcem który ma się douczyć po godzinach. Tak zostałem ekspertem AI, Neo4j i Nest.js . Przez mianowanie
LukeJL
  • Rejestracja:około 11 lat
  • Ostatnio:około 2 godziny
  • Postów:8423
2
nUmer napisał(a):

Cześć,

uzyskuję na wyjściu zagnieżdżoną listę jak poniższa:
[[60, 50], [30, 25], [80, 50], [40, 25]]

chcę uzyskać niepowtarzające się wartości dla każdej zagnieżdżonej na pozycji 0 i 1.
Czyli coś na kształt:
[[60, 50], [40, 25]]

Nie rozumiem, jak z pierwszej listy ma wyniknąć druga. Przecież 50 się powtarza. 25 też.


edytowany 1x, ostatnio: LukeJL
NU
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad rok
  • Postów:63
0

już staram się wytłumaczyć: [60,50] * 0.5 = [30,25]
Pragnę uzyskać pojedyńcze wartości (bądź wartość 100%, bądź 50%) z liczb które się nie powtórzą

BG
  • Rejestracja:prawie 6 lat
  • Ostatnio:dzień
  • Postów:289
1

A 25% albo 200% ? Opisz precyzyjnie jaki wynik chesz uzyskać...

LukeJL
  • Rejestracja:około 11 lat
  • Ostatnio:około 2 godziny
  • Postów:8423
1

Dalej nie rozumiem. To chcesz dzielić te liczby, żeby sprawdzić, czy nie są wielokrotnościami?
Np. jeśli jest 10, to już nie powinno być 50, bo jest to wielokrotność 10?


dalbajob
  • Rejestracja:prawie 2 lata
  • Ostatnio:4 miesiące
  • Postów:149
2

Te zagnieżdżone dwuelementowe listy rozpatrujesz całościowo (jako jeden byt)? To są jakieś współrzędne czy co?

Myślę że pomogłoby nam zrozumienie co te liczby oznaczają i co dokładnie chcesz osiągnąć biorąc z nich "niepowtarzające się wartości" (z, jak widzisz, mało zrozumiałą dla nas definicją tej niepowtarzalności)

Althorion
Moderator C/C++
  • Rejestracja:prawie 10 lat
  • Ostatnio:dzień
  • Postów:1605
1

Wytłumacz proszę, tak krok po kroku, jakbyś — ręcznie — otrzymał z [[60, 50], [30, 25], [80, 50], [40, 25]][[60, 50], [40, 25]].

Jak już przedmówcy zauważyli, z Twojego dotychczasowego opisu — „niepowtarzające się wartości dla każdej zagnieżdżonej na pozycji 0 i 1” — to nie wynika.

Idziemy bowiem od lewej do prawej, spoko, [60, 50] jest pierwsze, więc zostaje, rozumiem. Ale potem mamy [30, 25] — ani 30, ani 25, się jeszcze nie pojawiło, a wartość nie przechodzi. Piszesz niżej, że to dlatego, że „[60,50] * 0.5 = [30,25]”, czyli jakbyś miał wektory i chciał się pozbyć tych współliniowych z którymś z poprzedników, OK… ale potem kolejne jest [80, 50], które nie jest współliniowe z [60, 50]. Czy odpada dlatego, że druga współrzędna, 50, się powtarza? OK, załóżmy że tak. Potem masz [40, 25], to przechodzi, bo nie jest współliniowe z [60, 50], i nie powtarza się ani pierwsza współrzędna 4060, ani druga współrzędna 2550. Czy dobrze zrozumiałem? Że na liście znajdzie się:

  • pierwsza wartość
  • wartości, które są jednocześnie nie współliniowe (nie można uzyskać jednej pary przez przemnożenie pary już z listy przez jakąś stałą wartość na obu współrzędnych jednocześnie), oraz unikalne wobec wartości na liście na pierwszej i drugiej współrzędnej?

Czy może problemem jest to, że [80, 50] * 0.5 = [40, 25]? Ale jeśli tak, to czemu na liście znalazła się ta druga wartość, a nie pierwsza; skoro w pierwszym przypadku ([60,50[30, 25]) znalazła się pierwsza, a nie druga?

Podaj proszę oczekiwany rezultat dla takiej, na przykład, listy, oraz — jak już pisałem — opisz proces możliwie spójnie i dokładnie: [[1, 4], [1, 3], [2, 2], [2, 6], [3, 9], [4, 8], [4, 4], [3, 4], [10, 2], [5, 6], [5, 1]].

Oprócz tego — ile masz tych par wartości w tej liście (≈dziesięć, ≈tysiąc, ≈milion, ≈miliard?), oraz jak duże są (≈dziesięciu, ≈tysiąca, ≈miliona, ≈miliarda)?

obscurity
  • Rejestracja:około 6 lat
  • Ostatnio:około 3 godziny
3

Odpalam szklaną kulę i myślę że są to wektory i autor chce wyłuskać listę niepowtarzających się kierunków wektorów.

Do tego musiałbyś najpierw znormalizować współrzędne i porównywać znormalizowane wartości. Normalizujesz przez podzielenie wartości wektorów przez ich długość czyli np:

wektor [60, 30]
długość wektora to sqrt(60^2 + 30^2) = 78.10249675906654
po znormalizowaniu: [60 / 78.10249675906654, 30 / 78.10249675906654] = [0.7682212795973759, 0.6401843996644799]

Po znormalizowaniu wszystkich wektorów otrzymujesz taką listę:

Kopiuj
[
  [0.7682212795973759, 0.6401843996644799],
  [0.7682212795973759, 0.6401843996644799],
  [0.8479983040050879, 0.5299989400031799],
  [0.8479983040050879, 0.5299989400031799]
]

teraz jasno widać duplikaty i możesz je zwyczajnie odrzucić i odpowiadające im indeksy z pierwszej tabeli. Mogą pojawić się problemy przez niedokładności obliczeń na liczbach zmiennoprzecinkowych, polecam nie porównywać ich dokładnie tylko obrać jakąś małą wartość epsilon


"A car won't take your job, another horse driving a car will." - Horse influencer, 1910
edytowany 2x, ostatnio: obscurity
Althorion
Można i tak, ale zwykłe podzielenie pierwszej współrzędnej przez drugą — albo stworzenie z nich fractions.Fraction, jeśli obliczenia zmiennoprzecinkowe mogłyby być błędogenne — też zadziała, a będzie szybsze. Nie wiem, na ile autorowi na tym zależy, ale wciąż — jeśli nie potrzebuje konkretnie postaci znormalizowanej, to może być to sensowną alternatywą.
Althorion
Tyle że dalej zostaje problem, dlaczego z pary [[60, 50], [30, 25]] została zaliczona pierwsza wartość, a z pary [[80, 50], [40, 25]] — druga…
obscurity
jako że to python to obstawiam że może to być zadanie z data science a tu normalizacja jest normalnym procesem i biblioteki dostarczają proste funkcje do tego i usuwania duplikatów. Jeśli mam rację i chodzi tylko o kierunek to nie ma znaczenia która wartość z pary zostanie wyrzucona.
obscurity
Przy dzieleniu współrzędnych przez siebie będzie problem z zerami i ujemnymi wartościami - [50, -2] daje po podzieleniu ten sam wynik co [-50, 2] a podejrzewam że nie mają to być duplikaty. Można za to sobie darować pierwiastkowanie i porównywać kwadraty wartości, pierwiastek służy głównie czytelności dla człowieka i łatwiejszej wizualizacji wyników
W0
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 5 godzin
  • Postów:3584
0

@obscurity: tego nie trzeba normalizować, wystarczy zauważyć, że wektory wyznaczają ten sam kierunek kiedy jeden jest wielokrotnością drugiego - tj. istnieje takie A, dla którego: v1 = A*v2 . Po uproszczeniu wyjdzie, że x1/x2 = y1/y2. Oczywiście zadziała to wtedy, gdy x1, x2 oraz y1, y2 mają takie same znaki.

obscurity
ale czy to nie oznacza że musisz porównywać każdy element z każdym? Przy milionach elementów to będzie trwało wieki
W0
Nie do końca, bo x/y da ci tangens konta nachylenia do osi x. Trzeba obsłużyć wypadek gdy y = 0, ale i tak będzie to łatwiejsze i lżejsze od normalizowania wektorów.
obscurity
no w tangensie się powtarzają wartości przy kącie >180 i musisz obsłużyć parę wyjątków ale można wyliczyć po prostu kąt, nie wiem czy to będzie dużo szybsze
W0
Dlatego napisałem, że potrzebujesz informacji w której ćwiartce to leży. Jedyny wyjątek do obsługi to y=0.m, więc do wyznaczenia potrzebnych wartości potrzebujesz jednego dzielenia i kilku ifów, kontra dwa mnożenia, suma, pierwiastek i jeszcze dwa dzielenia. Oczywiście sprawa się zmieni jeśli skorzystasz z GPU, który normalizację ma hardware'owo zoptymalizowaną :)
AR
  • Rejestracja:ponad rok
  • Ostatnio:8 miesięcy
  • Postów:8
0

Nie wiem czy o to chodziło.

Kopiuj
lista = [[60, 50], [30, 25], [80, 50], [40, 25]]

unikalne_0 = {}
unikalne_1 = {}

wynik = []

for a, b in lista:
    if a not in unikalne_0 and b not in unikalne_1:
        unikalne_0[a] = True
        unikalne_1[b] = True
        wynik.append([a, b])

print(wynik)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.