Python Forum
Select the other of 2 items in a list
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Select the other of 2 items in a list
#1
I have a bit of code that selects the other of two items in a list. It works fine but I'm wondering if there a more pythonic way of doing it
import random
pieces = ["X", "O"]
piece = random.choice(pieces)
print(piece)

# is there a better way to select the other item in the list
opponent = pieces
opponent.remove(piece)
opponent = opponent[0]

print(opponent)
Reply
#2
What do you want to do, remove the piece from the existing list or get a new list that is the same as the existing but with the piece removed?
Reply
#3
I would probably just shuffle the list, then use the first one as my piece and the second as the opponent.

import random
pieces = ["X", "O"]
pieces = random.shuffle(pieces)

# my piece is always pieces[0] and my opponent is pieces[1]
If you really prefer to use separate variables for each piece (and I think there are reasons you shouldn't) then you could just sample the list like this...

import random
pieces = ["X", "O"]
piece, opponent = random.sample(pieces, k=2)
Reply
#4
(Aug-31-2020, 07:48 PM)bowlofred Wrote: I would probably just shuffle the list, then use the first one as my piece and the second as the opponent.

import random
pieces = ["X", "O"]
pieces = random.shuffle(pieces)

# my piece is always pieces[0] and my opponent is pieces[1]
If you really prefer to use separate variables for each piece (and I think there are reasons you shouldn't) then you could just sample the list like this...

import random
pieces = ["X", "O"]
piece, opponent = random.sample(pieces, k=2)

What I provided was just a simple working example. I need to be able to have one item of a list in a variable and use that yo put the other into a separate variable.
I cannot select them both at first as one item may be compared to many lists to select its counterpart from many list pairs.

opponent = pieces
opponent.remove(piece)
opponent = opponent[0]
Optomizing these 3 lines is my goal

(Aug-31-2020, 06:44 PM)deanhystad Wrote: What do you want to do, remove the piece from the existing list or get a new list that is the same as the existing but with the piece removed?

Not quite either. I have a list with two items and I have a variable containing one of those two items. I want to use the list and the variable to put the other item into a third variable.

Using a list and a variable containing one item in the list, I need to be able to store the other item in the list to a new variable.
Reply
#5
In your attempt above, if these are really lists then the opponent = pieces isn't useful because it's just referencing the pieces list, so any modification will modify both. I'm assuming that pieces already exists and that you don't want to change it.

If so, I'd use a comprehension to pull out everything that doesn't match. This doesn't check that there are really only two elements, or that piece is present as one of the elements. But if both are true, it will return the other element.
opponent = [x for x in pieces if x != piece][0]
Reply
#6
(Aug-31-2020, 08:51 PM)bowlofred Wrote: In your attempt above, if these are really lists then the opponent = pieces isn't useful because it's just referencing the pieces list, so any modification will modify both. I'm assuming that pieces already exists and that you don't want to change it.

If so, I'd use a comprehension to pull out everything that doesn't match. This doesn't check that there are really only two elements, or that piece is present as one of the elements. But if both are true, it will return the other element.
opponent = [x for x in pieces if x != piece][0]

You got it exactly. That is the answer that I was looking for. Thank you
Reply
#7
(Aug-31-2020, 08:30 PM)Clunk_Head Wrote: I need to be able to have one item of a list in a variable and use that yo put the other into a separate variable.
I think the solution, provided bu bowlorfred, that shuffle pieces and then unpack in two separate variables does exactly that and is the best one
If you can't explain it to a six year old, you don't understand it yourself, Albert Einstein
How to Ask Questions The Smart Way: link and another link
Create MCV example
Debug small programs

Reply
#8
(Sep-01-2020, 04:09 PM)buran Wrote:
(Aug-31-2020, 08:30 PM)Clunk_Head Wrote: I need to be able to have one item of a list in a variable and use that yo put the other into a separate variable.
I think the solution, provided bu bowlorfred, that shuffle pieces and then unpack in two separate variables does exactly that and is the best one

Not really, as they are to be drawn in separate pieces. This was not made evident by my original question or example. His later answer of using list comprehension serves the purpose for which I intended this code. I replied as such and marked the thread as solved.
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  deleting select items from a list Skaperen 13 800 Oct-11-2021, 01:02 AM
Last Post: Skaperen
  Getting All Items From A List knight2000 4 473 Sep-25-2021, 12:56 AM
Last Post: knight2000
  Feed List items with Integer euras 9 1,317 May-19-2021, 07:45 PM
Last Post: snippsat
  Parse String between 2 Delimiters and add as single list items lastyle 5 1,115 Apr-11-2021, 11:03 PM
Last Post: lastyle
  Sum of list items tristanfermat 2 841 Feb-06-2021, 12:04 PM
Last Post: tristanfermat
  Count number of occurrences of list items in list of tuples t4keheart 1 940 Nov-03-2020, 05:37 AM
Last Post: deanhystad
  concatenating 2 items at a time in a python list K11 3 933 Oct-21-2020, 09:34 AM
Last Post: buran
  Removing items from list if containing a substring pythonnewbie138 2 939 Aug-27-2020, 10:20 PM
Last Post: pythonnewbie138
  Select correct item from list for subprocess command pythonnewbie138 6 1,332 Jul-24-2020, 09:09 PM
Last Post: pythonnewbie138
  Print the number of items in a list on ubuntu terminal buttercup 2 946 Jul-24-2020, 01:46 PM
Last Post: ndc85430

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020