#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) меньше задействовано ввода ([...]
vslist(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. Спасибо за ответ азро. Быстрый вопрос, когда тогда было бы более целесообразно использовать карту? Это когда мы хотим применить более сложный метод/функцию к каждому элементу в списке/строке? Вместо простого умножения?