Почему этот простой набор объединений возвращает неожиданно завернутый результат?

#python #join

#python #Присоединиться

Вопрос:

Я пытался объединить три цифры (шестнадцатеричный код) в одну строку, и произошло что-то странное.

 a='00'
b='01'
c='ff'

abc = ''.join(a).join(b).join(c)
print(abc)
  

и я получаю результат:

f0001f вместо ожидаемого 0001ff

Что может быть причиной этого?

Комментарии:

1. «.join() — это ваш разделитель для следующего соединения и так далее

2. join() обрабатывает его параметр как итерируемый. В вашем примере (т. Е. Вашем a , b и c ) параметр представляет собой набор из двух элементов, которые он помещает по обе стороны от строки, с которой он работает.

Ответ №1:

«join» объединяет все элементы в списке со строкой, по которой он был вызван.

Итак

 ",".join(['a', 'b', 'c']) = "a,b,c"
  

Итак, что вы на самом деле делаете в своем коде, это

 ''.join('00') -> "00"
'00'.join('01') -> "0001"
'0001'.join('ff') -> "f0001f"
  

Ответ №2:

Давайте посмотрим это шаг за шагом

 ''.join('00') => 0 '' 0 => 00
'00'.join('01') => 0 00 1 => 0001
'0001'.join('ff') => f 0001 f => f0001f
  

Комментарии:

1. Это ответ

Ответ №3:

Я думаю, вы неправильно поняли, что join() делает.

''.join(a) вернется 00 , поскольку он будет присоединять каждый символ a к пустой строке, ничего не делая.

Однако следующим вызовом будет, '00'.join(b) который соединит каждый символ b с 00 , что приведет к 0001 . Тогда '0001'.join(c) даст вам f0001f , потому что он объединяет символы из c с 0001


Вероятно, вы искали следующее: ''.join([a, b, c]) который объединит три строки вместе с пустой строкой в качестве ее «разделителя».

Другим вариантом было бы простое a b c . Это менее оптимизировано, но для таких коротких строк это вообще не должно иметь значения!

Ответ №4:

Вы можете попробовать (конкатенация строк. В этом нет необходимости join .):

 >>> a='00'
>>> b='01'
>>> c='ff'
>>> a b c
'0001ff'
  

Ответ №5:

Если вы используете Python 3.6 или новее, вы можете использовать так называемые f-строки для получения желаемого результата:

 a='00'
b='01'
c='ff'
out=f'{a}{b}{c}'
print(out) #0001ff
  

Если вы хотите узнать больше о f-строках, я предлагаю прочитать это руководство.