Как реализовать добавление в словарь элементов?
n = int(input())
sl = {}
for i in range(n):
a = list(map(int(input())))
sl[n//2] =
к примеру на вход подаются такие числа:
3
1 2 3 4
3 2 3 1
4 1 5 3
пытаюсь сделать так, чтобы в словарь попадал ключ - это число из строки матрицы, индекс которой n // 2, а значение к этому ключу – список отсортированных по возрастанию нечетных чисел того же столбца и той же строки (без числа-ключа) без повторений
проблема в том что ключ n//2 я добавляю ,но к нему нужно ведь добавлять и значение сразу же, а как его добавлять я не знаю, ибо нужно же в качестве значения взять числа из строки и столбца, а если к примеру только ввели 1 строку, то столбца же всего нет, чтобы взять значения
примерно, как должно получиться в итоге(входные данные к этому рез-ту написаны выше в примере):
{3: [1, 3, 5], 2: [1, 3], 1: [3]}
UPDATE:
Zhihar
Вывод
{1: [1, 3, 5], 2: [1, 3], 3: [1, 3, 5], 4: [1, 3, 5], 5: [1, 3, 5]}
Вывод
{1: [3, 5], 2: [1, 3], 3: [1, 3, 5], 4: [1, 3, 5], 5: [1, 3]}
UPDATE 2.0:
Более четкая формулировка:
Формат ввода
Вводится число n – количество строк в списке.
Затем вводятся строки из чисел, записанных через пробел.
Формат вывода
Вывести словарь, в котором ключи – это числа из строки матрицы, индекс которой n // 2, а значения – список отсортированных по возрастанию нечетных чисел того же столбца и той же строки (без числа-ключа) без повторений. Если в строке встречаются одинаковые числа, то значения добавляются в один список
Ответы (3 шт):
это не так работает:
a = list(map(int(input())))
надо
a = list(map(int, input().split()))
т.е.
- получить ввод пользователя
input() - разбить полученный текст на слова (через пробел как разделитель)
.split() - к каждому слову применить функцию
int()черезmap(функция вызывается указанную функциюint()к каждому элементу списка и записывает результат в новый список)
Если я правильно понял задачу, то должно получиться как-то так:
без оптимизаций, более-менее в лоб
# получить входные данные от пользователя
matrix = [list(map(int, input().split())) for _ in range(int(input()))]
# проанализировать данные
dictionary = {}
for i in range(len(matrix)):
for j in range(len(matrix[i])):
key = matrix[i][j]
# проанализировать строку и получить нечетные значения
line1 = [matrix[i][x] for x in range(len(matrix[i])) if matrix[i][x] % 2]
# проанализировать столбец и получить нечетные значения
line2 = [matrix[x][j] for x in range(len(matrix)) if matrix[x][j] % 2]
# добавить в словарь
if key not in dictionary:
dictionary[key] = []
dictionary[key] = sorted(set(dictionary[key] + line1 + line2))
print(dictionary)
если сам элемент (i, j) в анализе участвовать не должен, тогда надо сделать так:
# проанализировать строку и получить нечетные значения
line1 = [matrix[i][x] for x in range(len(matrix[i])) if matrix[i][x] % 2 and x != j]
# проанализировать столбец и получить нечетные значения
line2 = [matrix[x][j] for x in range(len(matrix)) if matrix[x][j] % 2 and x != i]
P.S.
разобравшись с задачей получается такой код (через упрощение первоначального общего):
# получить входные данные от пользователя
matrix = [list(map(int, input().split())) for _ in range(int(input()))]
# проанализировать данные
dictionary = {}
for i in range(len(matrix)):
for j in range(len(matrix[i])):
if i == len(matrix) // 2:
# проанализировать строку и получить нечетные значения
line1 = [matrix[i][x] for x in range(len(matrix[i])) if matrix[i][x] % 2 and x != j]
# проанализировать столбец и получить нечетные значения
line2 = [matrix[x][j] for x in range(len(matrix)) if matrix[x][j] % 2 and x != i]
# добавить в словарь
key = matrix[i][j]
if key not in dictionary:
dictionary[key] = []
dictionary[key] = sorted(set(dictionary[key] + line1 + line2))
print(dictionary)
P.P.S.
код можно пооптимизировать, например если перенести условия и вычисления связанные только с i под for i и над for j - т.е. кол-во вычислений можно значительно сократить (на случай, если тест еще и время засекает)
Цикл по средней строке. В цикле собираем нечётные числа из столбцов в словарь. Аналогично собираем числа из средней строки. Элемент в центре "креста" пропускаем - он ключ но в значение не должен попасть. Отдельный цикл множества переводит в упорядоченные списки:
def odd_set(iterable):
return set(v for v in iterable if v % 2 == 1)
n = int(input())
m = tuple(
tuple(map(int, input().split()))
for _ in range(n)
)
cols = {}
for j, k in enumerate(m[n // 2]):
col_set = odd_set(r[j] for i, r in enumerate(m) if i != n // 2)
row_set = odd_set(vv for jj, vv in enumerate(m[n // 2]) if jj != j)
cols.setdefault(k, set()).update(col_set | row_set)
print({k: sorted(v) for k, v in cols.items()})
$ echo -e "3\n1 2 3 4\n3 2 3 1\n4 1 5 3" 3 1 2 3 4 3 2 3 1 4 1 5 3 $ echo -e "3\n1 2 3 4\n3 2 3 1\n4 1 5 3" | python strange_matrix.py {3: [1, 3, 5], 2: [1, 3], 1: [3]}