[Python] Zoeken op lijst van items

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • kaypee
  • Registratie: November 2022
  • Laatst online: 17-01-2024
Ik doe een get request uit een API, krijg daar bepaalde waardes voor terug.

code:
1
2
3
r_rooms = requests.get( roomsAPI,
                        headers={'Authorization':accessToken}, 
                        timeout=5)


Die waarden worden netjes opgelijst in een print:

code:
1
2
3
4
5
6
7
8
# Convert the JSON response to Python dictionary object
jsonData = r_rooms.json()

# Display list of available rooms
print("List of rooms:")
rooms = r_rooms.json()["items"]
for room in rooms:
    print (room["title"])


Maar als ik dan een zoekactie wil uitvoeren op die lijst:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Define a variable that will hold the roomId 
roomIdToMessage = None

# Find a room name
while True:
    roomNameToSearch = input('Enter full or partial name of the room to find: ')
    rooms = jsonData['items']

    for room in rooms:
        if(room['title'].find(roomNameToSearch) != -1):
            print ("Found rooms with the word " + roomNameToSearch)
            print ("Room name: '" + room['title'] + "' ID: " + room['id'])
            roomIdToMessage = room['id']
            roomTitleToMessage = room['title']
            break


is de actie enkel geslaagd als ik zoek op het bovenste lijstitem. Precies alsof hij stopt na zoeken in het 1e item en niet naar het 2e gaat?

Beste antwoord (via kaypee op 14-11-2022 20:13)


  • Daedalus
  • Registratie: Mei 2002
  • Niet online

Daedalus

Moderator Apple Talk

Keep tryin'

kaypee schreef op maandag 14 november 2022 @ 16:41:
Het is de bedoeling, als je een zoekwoord opgeeft dat niet in de lijst voorkomt, dat je de optie krijgt om deze aan te maken.
In plaats van 'magic variables' als None, kun je ook in Python het volgende doen:
Python:
1
2
3
4
5
6
7
8
9
haystack = ["foo", "bar", "baz", "foobar", "foobaz", "bazbar", "barbaz"]
needle = "boo"

for hay in haystack:
    if needle in hay:
        print(f"Found '{needle}' in '{hay}'!")
        break
else:
    print(f"Didn't find '{needle}' in {haystack}.")

“You know what I've noticed Hobbes? Things don't bug you if you don't think about them. So from now on, I simply won't think about anything I don't like, and I'll be happy all the time!” | 宇多田ヒカル \o/

Alle reacties


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Nu online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

Je hebt een break staan die er -volgens mij- niet hoort. Die breekt uit je for-lus -volgens mij-. Maar pin me d'r niet op vast, m'n python is wat roestig :P

Edit: heulegaar nie roestig nie! *O*

[ Voor 33% gewijzigd door RobIII op 14-11-2022 16:34 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • kaypee
  • Registratie: November 2022
  • Laatst online: 17-01-2024
RobIII schreef op maandag 14 november 2022 @ 16:33:
Je hebt een break staan die er -volgens mij- niet hoort. Die breekt uit je for-lus -volgens mij-. Maar pin me d'r niet op vast, m'n python is wat roestig :P

Edit: heulegaar nie roestig nie! *O*
Helaas niet opgelost hiermee :X

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Nu online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

kaypee schreef op maandag 14 november 2022 @ 16:34:
[...]

Helaas niet opgelost hiermee :X
Uh, dat zou wel moeten :? Weet je 't zeker? Ik zie geen reden waarom 'ie uit die for zou stappen anders dan de break (of een exception...).

Heb je wat voorbeelddata waar je mee test?

Dit (uitgeklede) voorbeeld werkt voor mij prima:

Python:
1
2
3
4
5
6
7
rooms = ["foo", "bar", "baz", "foobar", "foobaz", "bazbar", "barbaz"]

roomNameToSearch = 'foo'

for room in rooms:
    if (room.find(roomNameToSearch) != -1):
        print ("Found room with the word " + roomNameToSearch + ": " + room)


Output:

code:
1
2
3
Found room with the word foo: foo
Found room with the word foo: foobar
Found room with the word foo: foobaz

[ Voor 41% gewijzigd door RobIII op 14-11-2022 16:41 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • kaypee
  • Registratie: November 2022
  • Laatst online: 17-01-2024
Ik had de 2e if-voorwaarde nog niet gepost:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        if(roomIdToMessage is None):
            print("Did not find a room with " + roomNameToSearch + " in it.")
            choicecreate = input("Do you want to create a room? (y/n): ")
            match choicecreate:
                case "y":              
                    newname = input("Name your room: ") 
                    newroom = json.dumps({"title": newname})
                    createdroom = requests.request("POST", roomsAPI, 
                        headers={   'Authorization':accessToken, 
                                'Content-Type': 'application/json; charset=utf-8'},
                                data=newroom, 
                                timeout=5)
                    print("Created room " + newname)
                    quit()
                case "n":
                    print("Exiting the script")
                    quit()


Als ik deze in comments plaats, kan ik wel de gehele lijst doorzoeken.
Ik moet daar dus iets verkeerd in doen.

Het is de bedoeling, als je een zoekwoord opgeeft dat niet in de lijst voorkomt, dat je de optie krijgt om deze aan te maken.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Nu online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

kaypee schreef op maandag 14 november 2022 @ 16:41:
Ik had de 2e if-voorwaarde nog niet gepost:
Ja, het is wel zo handig als je alle relevante code post ;)

Begin eens met debuggen (Debuggen: Hoe doe ik dat?) en deel dan je bevindingen eens met ons...

Maar ik zie ook twee quit()'s waarvan er één teveel is me dunkt...

[ Voor 8% gewijzigd door RobIII op 14-11-2022 16:46 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Daedalus
  • Registratie: Mei 2002
  • Niet online

Daedalus

Moderator Apple Talk

Keep tryin'

Sowieso, als je alleen wilt weten of de substring matched en niet waar precies, kun je beter dit gebruiken:
Python:
1
2
if roomNameToSearch in room:
   ...

“You know what I've noticed Hobbes? Things don't bug you if you don't think about them. So from now on, I simply won't think about anything I don't like, and I'll be happy all the time!” | 宇多田ヒカル \o/


Acties:
  • 0 Henk 'm!

  • kaypee
  • Registratie: November 2022
  • Laatst online: 17-01-2024
Daedalus schreef op maandag 14 november 2022 @ 16:48:
Sowieso, als je alleen wilt weten of de substring matched en niet waar precies, kun je beter dit gebruiken:
Python:
1
2
if roomNameToSearch in room:
   ...
Hiermee vindt hij helemaal niets.

Ik zal eens mijn ganse geüpdate code hier posten. Tot en met lijn 19 werkt alles prima.

*snip*

[ Voor 109% gewijzigd door RobIII op 14-11-2022 17:06 ]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Nu online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

kaypee schreef op maandag 14 november 2022 @ 16:55:
Ik zal eens mijn ganse geüpdate code hier posten. Tot en met lijn 19 werkt alles prima.
Nou, nee, dat is nou ook weer niet de bedoeling. We willen best met je meedenken en/of je in de juiste richting wijzen, maar we gaan geen complete scripts debuggen. Al helemaal niet als je 't niet beperkt tot enkel relevante code ;)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Daedalus
  • Registratie: Mei 2002
  • Niet online

Daedalus

Moderator Apple Talk

Keep tryin'

kaypee schreef op maandag 14 november 2022 @ 16:55:
[...]
Hiermee vindt hij helemaal niets.
Dat is omdat ik het codevoorbeeld van @RobIII gebruikte :> Voor jouw code zul je een kleine aanpassing moeten maken.

“You know what I've noticed Hobbes? Things don't bug you if you don't think about them. So from now on, I simply won't think about anything I don't like, and I'll be happy all the time!” | 宇多田ヒカル \o/


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Nu online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

Daedalus schreef op maandag 14 november 2022 @ 16:48:
Sowieso, als je alleen wilt weten of de substring matched en niet waar precies, kun je beter dit gebruiken:
Daedalus schreef op maandag 14 november 2022 @ 17:08:
[...]
Dat is omdat ik het codevoorbeeld van @RobIII gebruikte :> Voor jouw code zul je een kleine aanpassing moeten maken.
Dat is niet wat TS zoekt/wil ;) Kijk eens heel goed naar regel 10 in de TS of regel 6 in mijn code...

[ Voor 14% gewijzigd door RobIII op 14-11-2022 17:12 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Daedalus
  • Registratie: Mei 2002
  • Niet online

Daedalus

Moderator Apple Talk

Keep tryin'

RobIII schreef op maandag 14 november 2022 @ 17:10:
[...]


[...]


Dat is niet wat TS zoekt/wil ;) Kijk eens heel goed naar regel 10 in de TS of regel 6 in mijn code...
Volgens mij zijn:
Python:
1
2
if (room.find(roomNameToSearch) != -1):
 ...
en
Python:
1
2
if roomNameToSearch in room:
 ...
equivalent, met het verschil dat de in beter performt, en mijns inziens duidelijker is. Functioneel maakt het weinig verschil.

Maar dit lost natuurlijk het probleem van de TS niet op :)

“You know what I've noticed Hobbes? Things don't bug you if you don't think about them. So from now on, I simply won't think about anything I don't like, and I'll be happy all the time!” | 宇多田ヒカル \o/


Acties:
  • +1 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Nu online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

Daedalus schreef op maandag 14 november 2022 @ 17:18:
[...]
Volgens mij zijn:
Python:
1
2
if (room.find(roomNameToSearch) != -1):
 ...
en
Python:
1
2
if roomNameToSearch in room:
 ...
equivalent, met het verschil dat de in beter performt, en mijns inziens duidelijker is. Functioneel maakt het weinig verschil.

Maar dit lost natuurlijk het probleem van de TS niet op :)
|:( Ik las 't als "in plaats van de for" 8)7 :F

Tijd voor weekend...

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


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

  • Daedalus
  • Registratie: Mei 2002
  • Niet online

Daedalus

Moderator Apple Talk

Keep tryin'

kaypee schreef op maandag 14 november 2022 @ 16:41:
Het is de bedoeling, als je een zoekwoord opgeeft dat niet in de lijst voorkomt, dat je de optie krijgt om deze aan te maken.
In plaats van 'magic variables' als None, kun je ook in Python het volgende doen:
Python:
1
2
3
4
5
6
7
8
9
haystack = ["foo", "bar", "baz", "foobar", "foobaz", "bazbar", "barbaz"]
needle = "boo"

for hay in haystack:
    if needle in hay:
        print(f"Found '{needle}' in '{hay}'!")
        break
else:
    print(f"Didn't find '{needle}' in {haystack}.")

“You know what I've noticed Hobbes? Things don't bug you if you don't think about them. So from now on, I simply won't think about anything I don't like, and I'll be happy all the time!” | 宇多田ヒカル \o/


Acties:
  • 0 Henk 'm!

  • kaypee
  • Registratie: November 2022
  • Laatst online: 17-01-2024
Update :)

Ik kan nu élke zoekterm terugvinden uit de waarden.

code:
1
2
3
Enter full or partial name of the room to find: Tes
Found rooms with the word Tes
Room name: 'Test' ID: Y2lzY29zcGFyazovL3VybjpURUFNOmV1LWNlbnRyYWwtMV9rL1JPT00vMDU2NmMwMTAtNWVhOC0xMWVkLWI4ZjctOGZlNWIwNjdlMzMw


Het huidige probleem is dat nu hij wel blijft doorgaan naar de else: desondanks dat de eerste if voldaan werd en ik een teller heb willen inbouwen

code:
1
2
Did not find a room with Tes in it.
Do you want to create a room? (y/n):


De belangrijkste code:

code:
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
# Find a room name
i = 1
while i < 2:
    roomNameToSearch = input('Enter full or partial name of the room to find: ')
    rooms = jsonData['items']

    for room in rooms:
        if(room['title'].find(roomNameToSearch) != -1):
            print ("Found rooms with the word " + roomNameToSearch)
            print ("Room name: '" + room['title'] + "' ID: " + room['id'])
            roomIdToMessage = room['id']
            roomTitleToMessage = room['title']
            i += 1
      
# Possibility to create a new room
    else:
        print("Did not find a room with " + roomNameToSearch + " in it.")
        choicecreate = input("Do you want to create a room? (y/n): ")
        if choicecreate == "y" or choicecreate == "Y":
            nameroom = input("Name your room: ") 
            newroom = json.dumps({"title": nameroom})
            createdroom = requests.request("POST", roomsAPI, 
                headers={   'Authorization':accessToken, 
                            'Content-Type': 'application/json; charset=utf-8'},
                            data=newroom, 
                            timeout=5)
            print("Created room: \n" + nameroom)
            break
        else:
            quit()

Acties:
  • 0 Henk 'm!

  • kaypee
  • Registratie: November 2022
  • Laatst online: 17-01-2024
Nog een update!

Ik heb de

else: (lijn 16)

Vervangen door

if i < 2:


Nu werkt het..

[ Voor 5% gewijzigd door kaypee op 14-11-2022 19:34 ]


Acties:
  • 0 Henk 'm!

  • kaypee
  • Registratie: November 2022
  • Laatst online: 17-01-2024
Bedankt allemaal om me in de juiste richting te sturen!

Acties:
  • 0 Henk 'm!

  • Daedalus
  • Registratie: Mei 2002
  • Niet online

Daedalus

Moderator Apple Talk

Keep tryin'

Mooi dat het nu werkt. Ik vroeg me af wat de functie is van de teller in regel 2, 3 en 13 (en na je wijziging regel 16)?

[ Voor 14% gewijzigd door Daedalus op 14-11-2022 21:55 ]

“You know what I've noticed Hobbes? Things don't bug you if you don't think about them. So from now on, I simply won't think about anything I don't like, and I'll be happy all the time!” | 宇多田ヒカル \o/


Acties:
  • 0 Henk 'm!

  • kaypee
  • Registratie: November 2022
  • Laatst online: 17-01-2024
Daedalus schreef op maandag 14 november 2022 @ 21:51:
Mooi dat het nu werkt. Ik vroeg me af wat de functie is van de teller in regel 2, 3 en 13 (en na je wijziging regel 16)?
Die gebruik ik als if-else voorwaarden

Acties:
  • 0 Henk 'm!

  • Daedalus
  • Registratie: Mei 2002
  • Niet online

Daedalus

Moderator Apple Talk

Keep tryin'

Dat zie ik :) Maar wat is het doel? Waarom wil je uit de loop breken als i < 2 is?

“You know what I've noticed Hobbes? Things don't bug you if you don't think about them. So from now on, I simply won't think about anything I don't like, and I'll be happy all the time!” | 宇多田ヒカル \o/


Acties:
  • 0 Henk 'm!

  • Ben(V)
  • Registratie: December 2013
  • Laatst online: 15:51
Een else na een for loop wordt alleen doorlopen als de hele loop wordt afgemaakt.

Als je dus een break toevoegt als een item gevonden is, kun je die rare constructie met die i variable helemaal weglaten.
Die else wordt dan alleen doorlopen als er geen break optrad.

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!

  • kaypee
  • Registratie: November 2022
  • Laatst online: 17-01-2024
Daedalus schreef op dinsdag 15 november 2022 @ 10:39:
Dat zie ik :) Maar wat is het doel? Waarom wil je uit de loop breken als i < 2 is?
Als er een room gevonden werd, wou ik dat hij de loop verbrak, en met break alleen lukte dat niet.
Maar ik heb de hoofdoorzaak gevonden denk ik:

roomIdToGetMessages = None

Dit moest ik IN de while functie gestopt hebben, niet ervóór. Dan had het eigenlijk altijd al gewerkt.

Acties:
  • 0 Henk 'm!

  • Daedalus
  • Registratie: Mei 2002
  • Niet online

Daedalus

Moderator Apple Talk

Keep tryin'

kaypee schreef op woensdag 16 november 2022 @ 08:52:
[...]


Als er een room gevonden werd, wou ik dat hij de loop verbrak, en met break alleen lukte dat niet.
Inderdaad, omdat je een for-loop in een while-loop hebt. Als je uit je for-loop breakt, kom je terecht in je while-loop, die vervolgens weer vrolijk je for-loop ingaat om nog een keer je room op te zoeken.

Zoals @Ben(V) al opmerkte: je hebt die hele while-loop en de rare constructie met de variabele i niet nodig. Als je je algoritme schrijft zoals ik liet zien, en je de break niet vergeet, dan werkt het zoals je verwacht.

edit:

En als bonus-vraag: als iemand zoekt naar "test", wil je dan ook de room met title "Test" vinden?

[ Voor 10% gewijzigd door Daedalus op 16-11-2022 09:01 ]

“You know what I've noticed Hobbes? Things don't bug you if you don't think about them. So from now on, I simply won't think about anything I don't like, and I'll be happy all the time!” | 宇多田ヒカル \o/


Acties:
  • 0 Henk 'm!

  • kaypee
  • Registratie: November 2022
  • Laatst online: 17-01-2024
De bonus-vraag is met .casefold() denk ik?

[ Voor 194% gewijzigd door kaypee op 16-11-2022 09:20 ]

Pagina: 1