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

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)
1

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

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)
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ż.

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ą

1

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

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?

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)

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)?

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ę:

[
  [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

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.

0

Nie wiem czy o to chodziło.

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)

1 użytkowników online, w tym zalogowanych: 0, gości: 1