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

Niepowtarzające się wartości w liście zagnieżdżonej.
NU
  • Rejestracja:około 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:około 14 godzin
  • 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:minuta
  • Postów:8403
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:około 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:8 dni
  • Postów:287
1

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

LukeJL
  • Rejestracja:około 11 lat
  • Ostatnio:minuta
  • Postów:8403
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:3 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:około 17 godzin
  • Postów:1603
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 2 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:2 minuty
  • Postów:3544
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:7 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)
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)