如何迭代列表列表并更改元素值?
How to iterate a list of lists and change element values?
我有一个列表列表:
game = [['X', 'O', 'O'], ['', '', 'O'], ['', '', '']]
我想更改所有值:
- 如果元素是'X'则设置为1。
- 如果元素是'O'则设置
到 2.
- 如果元素是“”(无),则设置为 0(零)。
输出将是:
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
。
我有一个列表列表:
game = [['X', 'O', 'O'], ['', '', 'O'], ['', '', '']]
我想更改所有值:
- 如果元素是'X'则设置为1。
- 如果元素是'O'则设置 到 2.
- 如果元素是“”(无),则设置为 0(零)。
输出将是:
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
。