При присвоении сложенных строк с пробелом, результат выводится в 9-ти переменных вместо 3-х. Python

Допустим сам код на Python:

x = "tyr"
y = 'red'
result = []
for i in range(len(x)):
    result.append((''.join(x[1] + (' - ') + y[1])).split())
print(result)

[['y', '-', 'e'], ['y', '-', 'e'], ['y', '-', 'e']]

Но если убрать пробеk:

 result.append((''.join(x[1] + ('-') + y[1])).split())

[['y-e'], ['y-e'], ['y-e']]

Почему так происходит и как получить результат [['y - e'], ['y - e'], ['y - e']], но не через replace.


Ответы (2 шт):

Автор решения: 4500zenja

На мой взгляд, в данном случае лучше всего использовать не запутанные join() и split(), а просто обернуть необходимые данные в f-строки — так будет и удобней, и понятней :)

x = "tyr"
y = 'red'
result = []
for i in range(len(x)):
    result.append(f'{x[i]} - {y[i]}')
print(result)

# ['t - r', 'y - e', 'r - d']

P.S. Ещё Вы забыли поставить i как индекс строки, вместо него Вы писали 1.

UPD: а если говорить о вопросе "почему так происходит?", стоит разобрать данное выражение: ''.join(x[1] + (' - ') + y[1])).split(). Шаги для его обработки получаются следующие:

  1. Сначала выполняется x[1] + (' - ') + y[1]. Все литералы строчные, так что скобки в данном случае убираются;
  2. В результате данного выражения получится 'x - y' с пробелами, где x и y — соответствующие символы строк;
  3. Функция join() ничего не делает, поскольку она работает со списками строк, но здесь строка цельная;
  4. Функция split() же, наоборот, делит строку на список строк, основываясь на передаваемом ей аргументе. По умолчанию это пробел, так что функция превращает строку из п.2 в список, состоящий из 3 символов-строк.

При снятии пробела же получается строка 'x-y', и ни join(), ни split() ничего с ней не сделают, поэтому сама строка останется прежней.

→ Ссылка
Автор решения: Namerek
x = 'tyr'
y = 'red'
z = [' - '.join(item) for item in zip(x, y)]

print(z)
# ['t - r', 'y - e', 'r - d']

Но меня смущает фраза в вопросе

как получить результат [['y - e'], ['y - e'], ['y - e']]

[[' - '.join(item)] for item in zip(x, y)]
# [['t - r'], ['y - e'], ['r - d']]

Но если нужен прямо как в вопросе

[[f'{x[1]} - {y[1]}'] for _ in range(len(x))]
# [['y - e'], ['y - e'], ['y - e']]
→ Ссылка