Как перебрать список списков и изменить значения элементов? - PullRequest
0 голосов
/ 25 октября 2018

У меня есть список списков:

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 голосов
/ 25 октября 2018

Много хороших ответов уже.Я добавлю один вкладыш, используя 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 из list s.

0 голосов
/ 25 октября 2018

Я бы определил правила в словаре, получил бы значения и использовал бы по умолчанию 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]]
0 голосов
/ 25 октября 2018

Теперь, когда у вас есть список ответов, который работает над исчерпанием всех возможностей преобразования значений списка списков на основе простого сопоставления, кажется, что было бы упущением не включать решение, использующее 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']]
0 голосов
/ 25 октября 2018

Использование словаря и понимание списка:

>>> 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 голосов
/ 25 октября 2018

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

Это даст вам список 2D с вашим подходом, использующим только петли.

0 голосов
/ 25 октября 2018

Создайте команду отображения и выполните итерацию списка (без создания нового списка)

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)
0 голосов
/ 25 октября 2018

Это просто с 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']
0 голосов
/ 25 октября 2018

Попробуйте перечислить список:

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)   
...