Как я могу использовать map (), чтобы утроить каждый символ каждой строки в списке, а не утроить каждую строку в списке?

#python #mapping

Вопрос:

У меня есть следующее list :

 eight_bit_binary = ['01101000', '01100101', '01111001']
 

Я хотел бы утроить каждый элемент eight_bit_binary , поэтому для «01101000» — > «000111111000111000000000»; и то же самое для второго и третьего элемента.

На мой взгляд, я знаю, что следующее не совсем работает, но это близко к тому, что мне нужно:

 eight_bit_binary = map(lambda n:n*3, eight_bit_binary)
 

Он производит «01101000» -> «011010000110100001101000», что, конечно, не то, что я хочу.

Как я могу настроить его так, чтобы он делал то, что я хотел бы? Я знаю, что там должно быть что-то для петли, но я не совсем понимаю. Любая помощь была бы великолепна!

Ответ №1:

 eight_bit_binary = ['01101000', '01100101', '01111001']
eight_bit_binary = [''.join([c*3 for c in item]) for item in eight_bit_binary]
print(eight_bit_binary)
 

Результатом было бы:

 ['000111111000111000000000', '000111111000000111000111', '000111111111111000000111']
 

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

1. Вопрос в том, как использовать map . Ты не пользуешься map .

2. ой, я просто основывался на утверждении, что автор вопроса сказал: «Должно быть, в этом замешан какой-то цикл, но я не совсем понимаю. Любая помощь была бы замечательна!». Я должен был заметить, что предлагаю comprehension решение вместо использования map

3. @not_speshal, показывающий лучший способ, — это бонус 🙂

4. @KellyBundy — Я не говорил, что это плохой способ. На самом деле, именно так я бы это сделал. Я просто сказал, что он не использует map то, что, по-видимому, хотел ОП.

Ответ №2:

map() позволяет получить доступ и изменить каждый элемент списка. Затем вам нужно получить доступ к каждому члену этих строк с помощью другого вызова map() .

 binary = ['01101000', '01100101', '01111001']
longer = list(map(lambda n: ''.join(map(lambda x: x*3, n)), binary))
 

Также обратите внимание, что я, вероятно, использовал бы здесь понимание списка, а не прямой вызов map() :

 [''.join(x*3 for x in b) for b in binary]
 

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

1. Спасибо за ответ. Быстрый вопрос, когда тогда было бы более целесообразно использовать карту? Это когда мы хотим применить метод/функцию к каждому элементу в списке/строке? Вместо простого умножения?

2. Честно говоря, я пришел из мира Java и Javascript, где map() и filter() более естественны. Но в конце концов я обнаружил, что чаще использую понимание списка, потому что 1) результат list -это, а не map объект, 2) синтаксис кажется немного более простым и 3) меньше задействовано ввода ( [...] vs list(map(lambda ...)) ). Могут быть случаи, когда map функция имеет немного лучшую производительность, но я думаю, что это почти никогда не актуально (преждевременная оптимизация).

Ответ №3:

Вы map(, eight_bit_binary) применяете логику к каждому значению eight_bit_binary , вы хотите, чтобы эта логика применялась к элементам каждого значения, вам нужен второй уровень итерации

 eight_bit_binary = ['01101000', '01100101', '01111001']
eight_bit_binary = ["".join(map(lambda n: n * 3, e)) for e in eight_bit_binary]
print(eight_bit_binary)
# ['000111111000111000000000', '000111111000000111000111', '000111111111111000000111']
 

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

1. Спасибо за ответ азро. Быстрый вопрос, когда тогда было бы более целесообразно использовать карту? Это когда мы хотим применить более сложный метод/функцию к каждому элементу в списке/строке? Вместо простого умножения?