Python: zoeken of 1 van de stringwaardes voorkomt in string

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • tweakfdr
  • Registratie: Juli 2008
  • Niet online
Ik heb een string gemaakt met verschillende waardes:
code:
1
Namen = ['Jan','Kees','Piet','Henk']


Nu heb ik een variabele zin en wanneer 1 van bovenstaande namen voorkomt wil ik een andere variabele zetten
code:
1
Zin = "Piet loopt in het box"


Nu is mijn code erg onoverzichtelijk
code:
1
2
3
4
5
    If "Piet" in Zin:
        categorie = "Gevonden" 
    elif ("Jan" in Zin) or ("Kees" in Zin):
    categorie = "Gevonden" 
.......<nog 10 regels>


Mijn idee was
code:
1
2
If Namen in Zin:
         categorie = "Gevonden"


Alleen dit werkt niet. Is er een handige methode om dit eenvoudig te doen met Python.

[ Voor 5% gewijzigd door tweakfdr op 06-03-2021 13:54 ]

Beste antwoord (via tweakfdr op 06-03-2021 14:20)


  • eatsoup
  • Registratie: November 2009
  • Laatst online: 10:04
Je kan ook any gebruiken:

code:
1
2
if any(naam in Zin for naam in Namen):
    categorie = "Gevonden"

Alle reacties


Acties:
  • +2 Henk 'm!

  • Michael_OsGroot
  • Registratie: Maart 2020
  • Laatst online: 15-11-2022

Michael_OsGroot

Yes... Yes!

Ja, je kan door namen loopen. Ik zit op mobiel, maar iets als:
code:
1
2
3
For naam in namen :
  If naam in zin:
    Bla

[ Voor 5% gewijzigd door Michael_OsGroot op 06-03-2021 13:59 ]

Chebyshev said it, and I'll say it again; There's always a prime between n and 2n | De donkere gedaanten zijn bijzonder vlug ter been; Ze lopen op vier poten, en ze kijken heel gemeen


Acties:
  • Beste antwoord
  • +2 Henk 'm!

  • eatsoup
  • Registratie: November 2009
  • Laatst online: 10:04
Je kan ook any gebruiken:

code:
1
2
if any(naam in Zin for naam in Namen):
    categorie = "Gevonden"

Acties:
  • +2 Henk 'm!

  • martyw
  • Registratie: Januari 2018
  • Laatst online: 08:52
Of nog korter met een list expansie
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
Python 3.8.5 (default, Jan 27 2021, 15:41:15) 
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> namen = ['Jan', 'Kees', 'Piet', 'Henk']
>>> zin = "Piet loopt in het bos"
>>> gevonden = [naam for naam in namen if naam in zin]
>>> print(gevonden)
['Piet']
>>> zin = "Anita loopt in het bos"
>>> gevonden = [naam for naam in namen if naam in zin]
>>> print(gevonden)
[]
>>>

Mogelijkheden genoeg :)

[ Voor 18% gewijzigd door martyw op 06-03-2021 14:13 ]


Acties:
  • 0 Henk 'm!

  • tweakfdr
  • Registratie: Juli 2008
  • Niet online
Bedankt allemaal voor het meedenken! Jullie zien zeker al dat ik geen programmeur ben. Soms zit je gewoon in een verkeerde cirkel te denken en kom je er niet uit.

De if any heb ik gebruikt.

Acties:
  • 0 Henk 'm!

  • martyw
  • Registratie: Januari 2018
  • Laatst online: 08:52
Overigens zit er in onze oplossingen een subtiele bug
code:
1
2
3
4
5
6
7
8
9
10
>>> namen = ['Jan', 'Kees', 'Piet', 'Henk']
>>> zin = "Jantine loopt in het bos"
>>> if any(naam in zin for naam in namen):
...     print("gevonden")
... 
gevonden
>>> gevonden = [naam for naam in namen if naam in zin]
>>> print(gevonden)
['Jan']
>>>

Deze kun je oplossen door de zin te splitsen in een lijst op 'whitespace' - spaties, newline, tabs, etc.
code:
1
2
3
4
5
6
7
8
9
>>> namen = ['Jan', 'Kees', 'Piet', 'Henk']
>>> zin = "Jantine loopt in het bos"
>>> gevonden = [naam for naam in namen if naam in zin.split()]
>>> print(gevonden)
[]
>>> if any(naam in zin.split() for naam in namen):
...     print("gevonden")
... 
>>>

Dit demonstreert het gevaar van stackoverflow programmeren 8)

Acties:
  • +2 Henk 'm!

  • Ben(V)
  • Registratie: December 2013
  • Nu online
Gebruik sets dat is echt het eenvoudigst

Gebruik geen list met namen maar een set, splits de zin op in set van woorden en bepaal met de "and" operator wat de doorsnede van beide sets is.
Dus Resultaat bevat alle elementen die in beide sets voorkomen.
Namen = {'Jan','Kees','Piet','Henk'}
Zin = "Piet loopt in de box"

Resultaat = Namen and set( Zin.split() )
Split gebruikt default een spatie als seperator, als je nog een andere seperators hebt zoals bijvoorbeeld een komma dan kun je met replace die eerst omzetten naar een spatie.
Het wordt dan:
Resultaat = Namen and set( Zin.replace(',', ' ').split() )

[ Voor 50% gewijzigd door Ben(V) op 06-03-2021 20:33 ]

All truth passes through three stages: First it is ridiculed, second it is violently opposed and third it is accepted as being self-evident.


Acties:
  • 0 Henk 'm!

  • Michael_OsGroot
  • Registratie: Maart 2020
  • Laatst online: 15-11-2022

Michael_OsGroot

Yes... Yes!

tweakfdr schreef op zaterdag 6 maart 2021 @ 14:22:
Bedankt allemaal voor het meedenken! Jullie zien zeker al dat ik geen programmeur ben. Soms zit je gewoon in een verkeerde cirkel te denken en kom je er niet uit.

De if any heb ik gebruikt.
Niets mis met met vragen stellen als je het mij vraagt, je hebt helder geformuleerd wat je wil, wat je hebt geprobeerd en dat je ontevreden bent met je huidige oplossing.
eatsoup schreef op zaterdag 6 maart 2021 @ 14:05:
Je kan ook any gebruiken:

code:
1
2
if any(naam in Zin for naam in Namen):
    categorie = "Gevonden"
Vraag: als je deze constructie gebruikt, kan je dan retourneren op welke naam deze any getriggerd wordt?

[ Voor 26% gewijzigd door Michael_OsGroot op 06-03-2021 21:48 ]

Chebyshev said it, and I'll say it again; There's always a prime between n and 2n | De donkere gedaanten zijn bijzonder vlug ter been; Ze lopen op vier poten, en ze kijken heel gemeen


Acties:
  • +1 Henk 'm!

  • martyw
  • Registratie: Januari 2018
  • Laatst online: 08:52
Ben(V) schreef op zaterdag 6 maart 2021 @ 19:59:
...
Split gebruikt default een spatie als seperator,
...
Even een mug ziften - split gebruikt default whitespace, zie de documentatie
Maar je oplossing met een set is mooier dan wat we tot nu toe hadden _/-\o_

Acties:
  • 0 Henk 'm!

  • martyw
  • Registratie: Januari 2018
  • Laatst online: 08:52
Michael_OsGroot schreef op zaterdag 6 maart 2021 @ 21:23:
[...]

Niets mis met met vragen stellen als je het mij vraagt, je hebt helder geformuleerd wat je wil, wat je hebt geprobeerd en dat je ontevreden bent met je huidige oplossing.


[...]


Vraag: als je deze constructie gebruikt, kan je dan retourneren op welke naam deze any getriggerd wordt?
Nee, any retouneert een boolean, zie de documentatie
code:
1
2
3
4
5
6
>>> namen = ['Jan', 'Kees', 'Piet', 'Henk']
>>> zin = "Kees loopt in het bos"
>>> gevonden = any(naam in zin.split() for naam in namen)
>>> print(gevonden)
True
>>>

Acties:
  • +1 Henk 'm!

  • Raynman
  • Registratie: Augustus 2004
  • Nu online
Michael_OsGroot schreef op zaterdag 6 maart 2021 @ 21:23:
[...]


Vraag: als je deze constructie gebruikt, kan je dan retourneren op welke naam deze any getriggerd wordt?
Sinds 3.8 kan je daar een assignment expression voor gebruiken:
Python:
1
2
if any((match := naam) in Zin for naam in Namen):
    print('Gevonden:', match)
Pagina: 1