HP Forums

Full Version: Bug? Tricky syntax? Finding items in a list
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
This program is meant to find the positions of items in a list.
A simple FOR loop, yes?
No, it has problems if the list contains lists.
It gives a Bad Agument Error...unless you insert a diagnostic print, in which case the inner list is printed, and nothing after that.

Code:



 EXPORT ListFIND(LST,ITEM)
 //Find all instances of ITEM
 BEGIN
  LOCAL II;
  LOCAL LSTPOSNS:={};
  PRINT();
  IF SIZE(LST) THEN //
   //LOOP COULD BE OPTIMISED BY USING POS TO LEAP TO NEXT MODE
   FOR II FROM 1 TO SIZE(LST) DO
    //THIS LOOKS EASY BUT FAILS IF LST CONTAINS A LIST
    //EG ({1,{},3,4},3) BAD ARGUMENT TYPE
    //BOTH EQ AND == FAIL

     //WITH PRINT:NO II=3 PRINTED
     //WITHOUT PRINT: BAD ARGUMENT ERROR
    //PRINT({II,LST(II)});
    IF EQ(LST(II),ITEM) THEN
     LSTPOSNS(0):=II;
    END;//IF 
   END;//FOR
  END;//IF
  //Return Positions that match ITEM
  RETURN LSTPOSNS;
 END;

EXPORT FINDER()
BEGIN
  MSGBOX(ListFIND({1,{},3,4},3));
END;

Example: Find({1,{},33,4},33) should yield {3}
But (1,{} ,3,4},3 fails.
Code:

EXPORT ListFIND(LST,ITEM)
BEGIN
  LOCAL II;
  LOCAL LSTPOSNS:={};
  PRINT();
  PRINT("List: "+STRING(LST));
  PRINT("FIND: "+STRING(ITEM)+"\n");


  FOR II FROM 1 TO SIZE(LST) DO
    IF TYPE(LST(II))=TYPE(ITEM) AND EQ(LST(II),ITEM) THEN
      LSTPOSNS(0):=II;
      PRINT("Pos: "+II)
    END
  END;

  RETURN LSTPOSNS;

END;
This is a little faster

Code:

EXPORT ListFIND2(LST,ITEM)
BEGIN
  LOCAL X,Y;
  LOCAL LSTPOSNS={};

  WHILE X:=POS(LST,ITEM) DO
    LSTPOSNS(0):=(Y:=X+Y);
    LST:=LST({X,SIZE(LST)}+1)
  END;

  RETURN LSTPOSNS;

END;
There are 2 list libraries in the software libraries that you might find useful. The first is an extension to the list functions, and the second (which uses the first) is for associated lists (content addressable memory). Both are linked to from the Programming Documentation section of the wiki here...
http://www.wiki4hp.com/doku.php?id=prime:start

Here are the 2 links...

First is the Programmer's Expanded List Library...

http://www.hpmuseum.org/forum/thread-700...light=list

Then there is the Associative List Library...

http://www.hpmuseum.org/forum/thread-909...light=list
(11-03-2017 04:19 PM)Carlos295pz Wrote: [ -> ]This is a little faster

Code:

EXPORT ListFIND2(LST,ITEM)
BEGIN
  LOCAL X,Y;
  LOCAL LSTPOSNS={};

  WHILE X:=POS(LST,ITEM) DO
    LSTPOSNS(0):=(Y:=X+Y);
    LST:=LST({X,SIZE(LST)}+1)
  END;

  RETURN LSTPOSNS;

END;

Yes...Actually, I see that as about 6 times faster, not just "a little".
I will include that version in my List API if I may.
http://www.hpmuseum.org/forum/thread-9411.html
(11-03-2017 04:19 PM)Carlos295pz Wrote: [ -> ]
Code:
    LST:=LST({X,SIZE(LST)}+1)

The +1 is a very nice trick !
Reference URL's