Почему этот простой набор объединений возвращает неожиданно завернутый результат? - PullRequest
0 голосов
/ 23 апреля 2019

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

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

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

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

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

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

Ответы [ 5 ]

3 голосов
/ 23 апреля 2019

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

Итак

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

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

''.join('00') -> "00"
'00'.join('01') -> "0001"
'0001'.join('ff') -> "f0001f"
2 голосов
/ 23 апреля 2019

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

''.join('00') => 0 '' 0 => 00
'00'.join('01') => 0 00 1 => 0001
'0001'.join('ff') => f 0001 f => f0001f
1 голос
/ 23 апреля 2019

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

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

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

1 голос
/ 23 апреля 2019

Вы можете попробовать (объединение строк. Не нужно join.):

>>> a='00'
>>> b='01'
>>> c='ff'
>>> a+b+c
'0001ff'
1 голос
/ 23 апреля 2019

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

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

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


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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...