Python 从pair中获取另一个元素

Python 从pair中获取另一个元素,python,list,python-3.x,Python,List,Python 3.x,如果我知道另一个元素,如何从Python3中的元素对(2个元素的列表)中获取一个元素?例如,在基于回合的策略游戏中,我想交换玩家: players = [playerA, playerB] active_player = playerA players_tmp = list(players) players_tmp.remove(active_player) active_player = players_tmp[0] 这段代码工作得很好,但很难看 当然,在这种特殊情况下,我可以始终存储活

如果我知道另一个元素,如何从Python3中的元素对(2个元素的列表)中获取一个元素?例如,在基于回合的策略游戏中,我想交换玩家:

players = [playerA, playerB]
active_player = playerA

players_tmp = list(players) 
players_tmp.remove(active_player)
active_player = players_tmp[0]
这段代码工作得很好,但很难看

当然,在这种特殊情况下,我可以始终存储活动玩家的索引(0或1),然后执行以下操作:

self._active_player = 1 - self._active_player
然后编写@property方法。但没那么有趣


有什么好方法吗?

这是切换标志的常用方法:

if active_player == playerA:
    active_player = playerB
else:
    active_player = playerA

这是切换标志的常用方法:

if active_player == playerA:
    active_player = playerB
else:
    active_player = playerA

对于在一对中查找另一个元素的任务,我只需编写一个简洁明了的函数:

def other_of(pair, item):
    a, b = pair
    return a if item == b else b
…
active_player = other_of(players, active_player)
但是,如果它适用于您的情况,则可能是循环选择选项的更好方式:

import itertools

player_rotation = itertools.cycle(players)
…
active_player = next(player_rotation)

对于在一对中查找另一个元素的任务,我只需编写一个简洁明了的函数:

def other_of(pair, item):
    a, b = pair
    return a if item == b else b
…
active_player = other_of(players, active_player)
但是,如果它适用于您的情况,则可能是循环选择选项的更好方式:

import itertools

player_rotation = itertools.cycle(players)
…
active_player = next(player_rotation)

您可以利用
True
可以用作索引1这一事实

>>> l = ['a','b']
>>> l['a' is l[0]]
'b'
>>> l['b' is l[0]]
'a'
因此,您可以将函数定义为

def find(l,i):
    return l[i is l[0]]
演示


您可以利用
True
可以用作索引1这一事实

>>> l = ['a','b']
>>> l['a' is l[0]]
'b'
>>> l['b' is l[0]]
'a'
因此,您可以将函数定义为

def find(l,i):
    return l[i is l[0]]
演示


当您想更换玩家并使用第一个元素时,只需进行交换即可,这样您就不必关心谁处于活动状态,因为每次都会得到不同的玩家:

players = ["playerA", "playerB"]

players[0],players[1] = players[1],players[0]

active = players[0]
或者更好,正如minitech评论的那样,只需调用
列表。反向调用

  players = ["playerA", "playerB"]
  players.reverse()
  active = players[0]
  print(active)
  playerB

当您想更换玩家并使用第一个元素时,只需进行交换即可,这样您就不必关心谁处于活动状态,因为每次都会得到不同的玩家:

players = ["playerA", "playerB"]

players[0],players[1] = players[1],players[0]

active = players[0]
或者更好,正如minitech评论的那样,只需调用
列表。反向调用

  players = ["playerA", "playerB"]
  players.reverse()
  active = players[0]
  print(active)
  playerB

一个更好的解决方案是有一个发电机

players = ['sdf','asdf','sasd']
active = 'sdf'
temp_players = (player for player in players if player != active)
active = temp_players.next()
通过这种方式,你可以拥有你所有球员的名单,每次都有一名球员替换。
如果一个团队中有多个球员同时比赛,这也会更容易。

一个更好的解决方案是使用发电机

players = ['sdf','asdf','sasd']
active = 'sdf'
temp_players = (player for player in players if player != active)
active = temp_players.next()
通过这种方式,你可以拥有你所有球员的名单,每次都有一名球员替换。 如果一个团队中有多个玩家同时进行比赛,这也会变得更容易。

使用set

players = {playerA, playerB}
active_player = {playerA}

active_player = players - active_player  

使用集合

players = {playerA, playerB}
active_player = {playerA}

active_player = players - active_player  

我建议:

players = ['playerA', 'playerB']
def active_player(): return players[0]
print(active_player()) 
players.reverse()
print(active_player()) 
这就产生了:

playerA
playerB
我建议:

players = ['playerA', 'playerB']
def active_player(): return players[0]
print(active_player()) 
players.reverse()
print(active_player()) 
这就产生了:

playerA
playerB

为什么要投否决票?这个问题只是想重新分配
活动的\u播放器
。为什么要投否决票?问题只是想重新分配
活动\u播放机
列表。反向
已就位。
列表。反向
已就位。您的解决方案看起来不错。由于active_player是一个对象的集合,所以我看到的唯一问题是从集合中检索active_player(而不销毁它)。@splattru
tuple(active_player)[0]
@splattru或
next(iter(active_player))
您的解决方案看起来不错。由于active_player是一个对象的集合,我看到的唯一问题是从集合中检索active_player(而不销毁它)。@splattru
tuple(active_player)[0]
@splattru或
next(iter(active_player))