Как присоединиться к смешанному списку (массив) (с целыми числами в нем) в Python?

У меня есть список (массив) со смешанным

a = ["x", "2", "y"]
b = ["x", 2, "y"]
print ":".join(a)
print ":".join(b)

Первое соединение работает, но второе генерирует исключение TypeError

Я придумал это, но является ли это решением Python?

print ":".join(map(str, b))

Кстати, я просто хотел бы записать эту строку в файл, поэтому, если для этого есть конкретное решение, я тоже признателен.

Ответ 1

Ваше решение работает хорошо и, вероятно, является одним из самых быстрых способов сделать это для небольших и средних списков, но оно создает ненужный список (в python2.x). Обычно это не проблема, но в некоторых случаях, в зависимости от объекта b, это может быть проблемой. Другой, который ленив в python2, а также python 3:

':'.join(str(x) for x in b)

Некоторые тайминги для python 2.7.3:

$ python -m timeit -s 'b = ["x", 2, "y"]' '":".join(map(str,b))'
1000000 loops, best of 3: 1.66 usec per loop
$python -m timeit -s 'b = ["x", 2, "y"]' '":".join([str(x) for x in b])'
1000000 loops, best of 3: 1.49 usec per loop
$ python -m timeit -s 'b = ["x", 2, "y"]' '":".join(str(x) for x in b)'
100000 loops, best of 3: 3.26 usec per loop
$python -m timeit -s 'from itertools import imap; b = ["x", 2, "y"]' '":".join(imap(str,b))'
100000 loops, best of 3: 2.83 usec per loop

Некоторые тайминги для python3.2:

$ python3 -m timeit -s 'b = ["x", 2, "y"]' '":".join(map(str,b))'
100000 loops, best of 3: 2.6 usec per loop
$ python3 -m timeit -s 'b = ["x", 2, "y"]' '":".join([str(x) for x in b])'
100000 loops, best of 3: 2.08 usec per loop
$ python3 -m timeit -s 'b = ["x", 2, "y"]' '":".join(str(x) for x in b)'
100000 loops, best of 3: 3.39 usec per loop

Обратите внимание, что если вы позволите циклу получить намного больше, различия становятся менее важными:

python2.7.3:

$ python -m timeit -s 'b = list(range(10000))' '":".join(str(x) for x in b)'
100 loops, best of 3: 4.83 msec per loop
$ python -m timeit -s 'b = list(range(10000))' '":".join([str(x) for x in b])'
100 loops, best of 3: 4.33 msec per loop
$ python -m timeit -s 'b = list(range(10000))' '":".join(map(str,b))'
100 loops, best of 3: 3.29 msec per loop

python 3.2.0

$ python3 -m timeit -s 'b = list(range(10000))' '":".join(str(x) for x in b)'
100 loops, best of 3: 6.42 msec per loop
$ python3 -m timeit -s 'b = list(range(10000))' '":".join([str(x) for x in b])'
100 loops, best of 3: 5.51 msec per loop
$ python3 -m timeit -s 'b = list(range(10000))' '":".join(map(str,b))'
100 loops, best of 3: 4.55 msec per loop

* все тайминги, выполненные на моем MacbookPro, OS-X 10.5.8 intel core2duo....

Примечания,

  • python2.x быстрее, чем python3.x во всех случаях (для меня)
  • List-comprehension окажется наиболее быстрым для вашего списка примеров, но map быстрее для большего списка. map, вероятно, медленнее для небольшого списка, так как вам нужно искать функцию, тогда как понимание списка не может быть "затененным", поэтому поиск не должен выполняться. Может быть другая точка поворота для ОГРОМНЫХ списков, где время, затрачиваемое на создание промежуточного списка, становится значительным.
  • выражение генератора всегда самое медленное (но в обоих случаях оно лениво)