Вывод индексов пустых значений из списков
Есть список:
field = [['a', ' ', ' '], [' ', 'b', ' '], ['c', ' ', ' ']]
Как вытащить с него индексы пустых элементов?
Пример:
free = (((0, 1), (0, 2)), ((1, 0),(1, 2)), ((2, 1), (2, 2))
Ответы (5 шт):
Автор решения: strawdog
→ Ссылка
Можно, например, так:
import numpy as np
field = [['a', ' ', ' '], [' ', 'b', ' '], ['c', ' ', ' ']]
idx = np.where(np.array(field) ==" ")
res = list(zip(idx[0], idx[1]))
res:
[(0, 1), (0, 2), (1, 0), (1, 2), (2, 1), (2, 2)]
Автор решения: Vadim.Sharoikin
→ Ссылка
можно так
field = [['a', ' ', ' '], [' ', 'b', ' '], ['c', ' ', ' ']]
a = []
for el in field:
x = [(field.index(el),i) for i, _ in enumerate(el) if _.replace(' ','') == '']
a.append(tuple(x))
print(tuple(a))
сработает даже если больше чем 1 пробел в строке. если это не надо просто замени
if _.replace(' ','') == ''
на
if _ == ' '
Автор решения: CameL
→ Ссылка
Простое решение через циклы
field = [['a', ' ', ' '], [' ', 'b', ' '], ['c', ' ', ' ']]
free = []
for line in field:
temp = []
for num, sumbol in enumerate(line):
if sumbol == ' ':
temp.append(num)
free.append(tuple(temp))
print(tuple(free)) # ((1, 2), (0, 2), (1, 2))
Чтобы результат получился в круглых скобках, в конце он преобразуется в tuple. Если это не нужно, можно все оставить в списках
Автор решения: Dmitry
→ Ссылка
Просто вкину, как вариант. Логика собирать в итогвый кортеж та же, но подход к поиску оформлен через строку и регулярное выражение. Понятно, что код не универсален и не быстр (регулярки не имеют отношение к быстродействию). Но для расширения методов и практик подойдет
import re
field = [['a', ' ', ' '], [' ', 'b', ' '], ['c', ' ', ' ']]
result = []
for item in field:
result.append([m.start() for m in re.finditer(' ', ''.join(item))])
free = tuple((count, value) for count, r in enumerate(result) for value in r)
Автор решения: SergFSM
→ Ссылка
однострочник:
tuple(tuple((i,x) for x,y in enumerate(j) if y==' ') for i,j in enumerate(field))
>>> out
'''
(((0, 1), (0, 2)), ((1, 0), (1, 2)), ((2, 1), (2, 2)))