如何迭代列表列表并更改元素值?

How to iterate a list of lists and change element values?

我有一个列表列表:

game = [['X', 'O', 'O'], ['', '', 'O'], ['', '', '']]

我想更改所有值:

输出将是:

game = [['1', '2', '2'], ['0', '0', '2'], ['0', '0', '0']]

我可以像这样迭代:

for list in game:
  for element in list:
    ...

但是要更改我的列表列表中的元素是另一回事,我可以使用追加创建一个新列表,但我得到类似 [1, 2, 2, 0, 0, 2, 0, 0, 0]

的内容

尝试枚举列表:

game = [['X', 'O', 'O'],['', '', 'O'],['', '', '']]

for list in game:
  for num,element in enumerate(list):
    if element == "X":
      list[num] = "1"
    if element == "O":
      list[num] = "2"
    if element == "":
      list[num] = "0"

print(game)   

使用 numpy

很简单
import numpy as np
game = np.array(game)

game[game=='X'] = 1
game[game=='O'] = 2
game[game==''] = 0

print(game.tolist())
# [['1', '2', '2'], ['0', '0', '2'], ['0', '0', '0']]

print(game.ravel().tolist())
# ['1', '2', '2', '0', '0', '2', '0', '0', '0']

创建映射字典并迭代列表(不创建新列表)

d={'X':'1','O':'2','':0}
for i in game:
    for idx,value in enumerate(i):
        i[idx]=d.get(value, str(value))

print(game) #[['1', '2', '2'], ['0', '0', '2'], ['0', '0', '0']]

如果您想创建一个全新的列表

d={'X':'1','O':'2','':0}
new_list=[]
for i in game:
    temp=[]
    for idx,value in enumerate(i):
        temp.append(d.get(value, str(value)))
    new_list.append(temp)

new_list = [] for list in game: new_sublist = [] for item in list: ... new_sublist += new_item new_list += new_sublist

这应该会为您提供一个仅使用循环的方法的二维列表。

使用字典和列表理解:

>>> game = [['X', 'O', 'O'], ['', '', 'O'], ['', '', '']]
>>> d = {'X': '1', 'O': '2', '': '0'}
>>> [[d[x] for x in row] for row in game]
[['1', '2', '2'], ['0', '0', '2'], ['0', '0', '0']]

我会在字典中定义规则并获取值并对空字符串使用默认值 0。

我也使用了列表理解。

仅列表理解:

new_game = [[rules.get(item, 0) for item in li] for li in game]

使用辅助函数:

game = [['X', 'O', 'O'],
['', '', 'O'],
['', '', '']]

rules = { 'X': '1', 'O': '2' }

def update_list(li):
  return [rules.get(item, 0) for item in li]

new_game = [update_list(li) for li in game]

print (new_game)

# [[1, 2, 2], [0, 0, 2], [0, 0, 0]]

现在你有了一个答案列表,它正在努力穷尽所有基于简单映射转换列表列表值的可能性,看来我们不包括使用 map()。所以这里是:

game = [['X', 'O', 'O'], ['', '', 'O'], ['', '', '']]

nums = [list(map(lambda x: '2' if x == 'O' else '1' if x == 'X' else '0', row)) for row in game]
print(nums)
# OUTPUT
# [['1', '2', '2'], ['0', '0', '2'], ['0', '0', '0']]

已经有很多很好的答案了。我将使用 map() 扔进一个衬里,只是因为它很有趣:

[list(map(lambda x: {'X':'1', 'O':'2', '':'0'}.get(x), i)) for i in game]

# [['1', '2', '2'], ['0', '0', '2'], ['0', '0', '0']]

说明:map()本质上是在传递的对象i之上应用一个函数,这些对象是game的子列表。在这种情况下,我们希望在 game 中的子列表 (i) 中的每个标记 (x) 上应用评分字典中的 .get(x)。结合列表理解,它会为您提供所有转换后的分数,作为 list 的新 list