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

时间:2018-10-25 15:11:08

标签: python list nested-lists

我有一个列表列表:

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]

8 个答案:

答案 0 :(得分:5)

使用字典和列表理解:

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

答案 1 :(得分:2)

很多很好的答案。我会用select ul.* from user_log ul where exists (select 1 from user_log ul2 where ul2.user_id = ul.user_id and ul2.comment = 'The one I want' ) and not exists (select 1 from user_log ul2 where ul2.user_id = ul.user_id and ul2.comment = 'The one I don''t want' ) ; 扔一个衬纸,只是因为它很有趣:

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应用于.get(x)的子列表(x)中的每个标记(i)上。结合列表理解功能,您可以将所有已转换的分数作为game个新的list中的得分。

答案 2 :(得分:1)

现在,您有了一个答案列表,该列表正在竭尽所有可能,以基于简单映射转换列表列表的值的所有可能性,似乎我们不应该考虑不包括使用{{1 }}。所以这里是:

map()

答案 3 :(得分: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)   

答案 4 :(得分:0)

使用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']

答案 5 :(得分: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)

答案 6 :(得分:0)

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

这应该为您提供仅使用循环的2D列表。

答案 7 :(得分: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]]