从对中获取另一个元素

Get the other element from pair

如果我知道另一个元素,如何从 Python 3 中的对(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

然后写@属性方法。不过没那么有趣

有什么漂亮的方法吗?

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

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)

不过,如果它适用于您的情况,itertools.cycle 可能是循环选项的更好方法:

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]]

演示

>>> find(["Player1","Player2"],"Player1")
'Player2'
>>> find(["Player1","Player2"],"Player2")
'Player1'

当你想改变球员时只需交换并取第一个元素然后你不必关心谁是活跃的因为每次你都会得到不同的球员:

players = ["playerA", "playerB"]

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

active = players[0]

或者像 minitech 评论的那样更好,只需调用 list.reverse

  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 = {playerA, playerB}
active_player = {playerA}

active_player = players - active_player  

或;

players = {playerA, playerB}
active_player = playerA

active_player = (players - {active_player}).pop()  

我建议:

players = ['playerA', 'playerB']
def active_player(): return players[0]
print(active_player()) 
players.reverse()
print(active_player()) 

给出:

playerA
playerB
# conditional expressions
active_player = players[0] if players[1] == active_player else players[1]

# negative index
active_player = players[players.index(active_player) - 1]