Python value in list compare to other elements in list

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • jowe
  • Registratie: November 2010
  • Laatst online: 07-10-2024
Goedemiddag allemaal,

Stel ik heb een lijst in Python:
list1 = ['444.00', '445.00', '38.00', '38.00', '38.00', '13920.87', '13920.87', '13920.87', '13920.87', '13920.87']
Nu wil ik elke waarde in Python vergelijken met een andere waarde in de lijst, vervolgens een check doen of deze waarde tussen 2 waardes ligt.

Voorbeeld:
444.00 wil ik vergelijken met alle andere values of deze tussen 444+400=844 en 444-400=44 passen, in deze lijst zou dat als resultaat moeten geven 445.00. Dit is het enige getal in de lijst die tussen 44 en 844 ligt.

Wat ik heb geprobeerd:
Python:
1
2
3
4
5
6
7
counter = 0
for x in list1:
   Highnumber = x+400.00
   Lownumber = x-400.00
   for y in list1:
      if Lownumber < y < Highnumber:
         counter += 1

Het probleem is nu dat doordat het een dubbele loop is de eigen waarde ook wordt meegenomen in de check en dus ervoor zorgt dat de counter += 1 wordt getriggerd.

Ik zit een beetje vast op dit probleem en hoop dat jullie mij verder kunnen helpen!

Thanks!

[ Voor 6% gewijzigd door jowe op 18-11-2016 17:15 ]

Beste antwoord (via jowe op 21-11-2016 14:08)


  • SPee
  • Registratie: Oktober 2001
  • Laatst online: 17:57
De eigen waarde uitsluiten?

x != y toevoegen aan regel 6?

Alleen je zit wel met mogelijke dubbele waardes, dus die check moet je maar 1 keer doen.
Anders kun je het niet op deze manier oplossen en moet je het doen op basis van de index

Python:
1
2
3
4
5
for index1 in range(0, len(list1):
  high = list1[index1]
  for index2 in range(0,len(list1):
    if list[index2] < high && index1 != index 2:
       counter++

let the past be the past.

Alle reacties


Acties:
  • 0 Henk 'm!

  • Daos
  • Registratie: Oktober 2004
  • Niet online
Je kan dan toch gewoon een kopie van je lijstje maken, x eruit verwijderen en dat dan gebruiken voor je binnenste loop?

Acties:
  • Beste antwoord
  • 0 Henk 'm!

  • SPee
  • Registratie: Oktober 2001
  • Laatst online: 17:57
De eigen waarde uitsluiten?

x != y toevoegen aan regel 6?

Alleen je zit wel met mogelijke dubbele waardes, dus die check moet je maar 1 keer doen.
Anders kun je het niet op deze manier oplossen en moet je het doen op basis van de index

Python:
1
2
3
4
5
for index1 in range(0, len(list1):
  high = list1[index1]
  for index2 in range(0,len(list1):
    if list[index2] < high && index1 != index 2:
       counter++

let the past be the past.


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
jowe schreef op vrijdag 18 november 2016 @ 17:12:
Het probleem is nu dat doordat het een dubbele loop is de eigen waarde ook wordt meegenomen in de check en dus ervoor zorgt dat de counter += 1 wordt getriggerd.
Hoezo is dat een probleem, want je weet toch hoe vaak dat gebeurd? Je kunt bijvoorbeeld counter laten beginnen op -len(list1)..

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • jowe
  • Registratie: November 2010
  • Laatst online: 07-10-2024
Thanks! ik ga jullie ideeën dit weekend eens even testen!
Ik laat het horen!

Acties:
  • 0 Henk 'm!

  • jowe
  • Registratie: November 2010
  • Laatst online: 07-10-2024
Het is gelukt met het antwoord van SPee.
Bedankt voor jullie input!

Acties:
  • 0 Henk 'm!

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
counter = -1 voor de loop is toch veel simpeler?

Acties:
  • 0 Henk 'm!

  • jowe
  • Registratie: November 2010
  • Laatst online: 07-10-2024
Nope want het komt vaker dan 1 keer voor, het komt namelijk voor elke value in de lijst x het aantal value's in de 2e lijst.

Acties:
  • 0 Henk 'm!

  • Croga
  • Registratie: Oktober 2001
  • Laatst online: 15:58

Croga

The Unreasonable Man

jowe schreef op dinsdag 22 november 2016 @ 08:30:
Nope want het komt vaker dan 1 keer voor, het komt namelijk voor elke value in de lijst x het aantal value's in de 2e lijst.
code:
1
2
3
4
5
6
7
8
counter = 0
for x in list1:
   Highnumber = x+400.00
   Lownumber = x-400.00
   counter -= 1
   for y in list1:
      if Lownumber < y < Highnumber:
         counter += 1

Acties:
  • 0 Henk 'm!

  • jowe
  • Registratie: November 2010
  • Laatst online: 07-10-2024
Stel ik heb een lijst waar ik 100 value's heb die niet binnen de range vallen, dan wordt de counter -1 100x getriggerd. Dit lijkt mij ongeldig.

Acties:
  • 0 Henk 'm!

  • Raynman
  • Registratie: Augustus 2004
  • Laatst online: 23:16
x valt per definitie binnen zijn eigen range, dus die counter-- wordt in de binnenste loop weer opgeheven in de iteratie waarin y gelijk is aan x.

Acties:
  • 0 Henk 'm!

  • jowe
  • Registratie: November 2010
  • Laatst online: 07-10-2024
Dan zou ik dus
Python:
1
if Lownumber <= y <= Highnumber:
moeten gebruiken ipv
Python:
1
if Lownumber < y < Highnumber:

Acties:
  • 0 Henk 'm!

  • Daos
  • Registratie: Oktober 2004
  • Niet online
Eh, < is niet hetzelfde als <=. Welke je moet gebruiken kunnen wij hier niet zo zeggen. Dat hangt van jouw probleem af.

En hoe vond je mijn oplossing? Je hoeft dan niet te rotzooien met indices. Dat wordt dan zoiets als je eenmalig x wilt overslaan:
Python:
1
2
3
4
5
...
innerList = list(list1)
innerList.remove(x)
for y in innerList:
...


Of als je alle x-en eruit wilt hebben:
Python:
1
innerList = list(filter(lambda a: a != x, list1))

Acties:
  • 0 Henk 'm!

  • Morrar
  • Registratie: Juni 2002
  • Laatst online: 09-10 13:33
Hmm wellicht een idee om de originele lijst eerst (oplopend) te sorteren? Dan kun je de binnenste loop afbreken zodra een waarde over de bovengrens gaat. Scheelt performance als de lijst groot wordt.

Daarnaast: als de intervallen symmetrisch zijn (bijvoorbeeld -400 en + 400), dan zijn de relaties dat ook. Dus bij index 0 = 444 zal de counter omhoog gaan door de waarde 445 op index 1. Omgekeerd gaat de counter ook omhoog bij index 1 = 445 door de waarde 444 op index 0 ...

Sowieso zal de counter in totaal 6x omhoog gaan door de 3 waardes van 38.00 (+2 voor iedere keer 38.00 in de lijst).

Is dat wel wat je wilt?

[ Voor 3% gewijzigd door Morrar op 22-11-2016 20:42 ]


Acties:
  • 0 Henk 'm!

  • jowe
  • Registratie: November 2010
  • Laatst online: 07-10-2024
Mijn doel is, het tellen van het aantal value's in een lijst die binnen een selectie van een range vallen. Deze range begint met het laagste getal in de lijst +200. Ik heb de code wat aangepast aangezien ik nooit meer dan van 4 lijsten zou hebben waarop ik deze check wil uitvoeren. Mijn code is nu als volgt.(voorbeeld getallen + voorbeeld range)
Python:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
list1 = [100,100,100,300,400]
list2 = [100,200,300,450]
list3 = [100,250,350,500]
list4 = [list1,list2,list3]
counter = 0 
list1.sort(key=float),list2.sort(key=float),list3.sort(key=float),list4.sort(key=float)
Range = 200
MinValue = list4[0]
MaxValue =  MinValue + Range
i=0
n = len(list4)
while i < n:
    Checker = False
    if not len(list1) == 0 and MinValue <= list1[0] <= MaxValue:
        list4.remove(list[0])
        del list1[0]
        Checker = True
        n += -1 
    if not len(list2) == 0 and MinValue <= list2[0] <= MaxValue:
        list4.remove(list[0])
        del list2[0]
        Checker = True
        n += -1 
    if not len(list3) == 0 and MinValue <= list3[0] <= MaxValue:
        list4.remove(list[0])
        del list3[0]
        Checker = True
        n += -1 
    if not len(list4) == 0 and MinValue <= list4[0] <= MaxValue:
        list4.remove(list[0])
        del list4[0]
        Checker = True
        n += -1 
    if not Checker:
        if len(list4) >0:
            Range = 200
            MinValue = list4[0]
            MaxValue =  MinValue + Range
    if Checker:
        Counter += 1


Ik weet zeker dat er een makkelijker manier is maar ik werk nu een half jaartje met Python dus moet het e.e.a. nog even leren.
Pagina: 1