Большая часть способа Pythonic связать строки

Учитывая этот безопасный небольшой список:

>>> lst = ['o','s','s','a','m','a']

Моя цель состоит в том, чтобы pythonically связать маленьких дьяволов, использующих один из следующих путей:

A. простая строковая функция, чтобы сделать задание, короткий, никакой импорт

>>> ''.join(lst)
'ossama'

B. лямбда, лямбда, лямбда

>>> reduce(lambda x, y: x + y, lst)
'ossama'

C. глобализация (ничего не делают, импортируйте все),

>>> import functools, operator
>>> functools.reduce(operator.add, lst)
'ossama'

Предложите другие pythonic способы достигнуть этой великодушной задачи.

Займите место (pythonic уровень) и решения для уровня, дающие краткие объяснения.

В этом случае действительно ли большей частью pythonic решения является лучшее решение для кодирования?

40
задан Tim Pietzcker 26 January 2010 в 14:00
поделиться

6 ответов

Как @gabriel Я не Perl Programmer Так что возможно, что это то, что ваш код уже делает ...

Вы разместили только один пример. Неясно, хотите ли вы случайную матрицу, которая имеет одинаковое количество 1s в каждой строке и столбце в качестве матрицы запуска, или один из которых имеет те же ряды и столбцы, но, но смягчающиеся. Если последний достаточно хорош, вы можете создать массив строки (или столбца, это не имеет значения) индексов и случайным образом Perrise это. Затем вы можете прочитать ваш оригинальный массив в порядке, указанном в рандомизированном индексе. Нет необходимости изменять исходный массив или создать копию.

Конечно, это может не соответствовать аспектам ваших требований, которые не являются явными.

-121--2975499-

Взгляна на эссе Гвидо на оптимизации Python, охватывает преобразование списков чисел на строки. Если у вас нет хорошего причина, чтобы сделать в противном случае, используйте пример пример .

34
ответ дан 27 November 2019 в 01:06
поделиться
''.join(lst)

единственный путь Pythonic:

  • ясно (что все большие мальчики делают и что они ожидают Чтобы увидеть),
  • простым (без необходимости дополнительных импорта, устойчивых к всем версиям),
  • быстро (записано в C) и
  • , кратко (на пустой строке присоединяйтесь к элементам ITERABLE!).
60
ответ дан 27 November 2019 в 01:06
поделиться

Конечно, это присоединиться . Откуда мне знать? Давайте сделаем это в действительно глупым способом:
Если проблема была только добавления 2 строк, вы, скорее всего, используете Str1 + STR2 . Что нужно, чтобы получить это на следующий уровень? Инстинктивно, для большинства (я думаю), будет использовать сумму . Давайте посмотрим, как это идет:

In [1]: example = ['a', 'b', 'c']
In [2]: sum(example, '')
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython console> in <module>()
TypeError: sum() can't sum strings [use ''.join(seq) instead]

вау! Python просто сказал мне, что использовать! :)

18
ответ дан 27 November 2019 в 01:06
поделиться

Я сам использую путь «присоединиться», но из Python 2.6 есть базовый тип, который мало используется: BYTEARRAY .

ByTearRays может быть невероятным полезным - для строки, содержащих тексты, поскольку лучшее - тогда в Unicode, «Присоединение» Путь - это путь - но если вы имеете дело с двоичными данными, Bytearrays может Будьте более Pythonic, так и более эффективными:

>>> lst = ['o','s','s','a','m','a']
>>> a = bytearray(lst)
>>> a
bytearray(b'ossama')
>>> print a
ossama

Это встроенный тип данных: никаких необходимых импорта - просто используйте, и вы можете использовать intearray isntead список, чтобы начать с - поэтому они должны быть более эффективными, чем «Присоединяйтесь», поскольку нет копирования данных для получения строкового представления для ByTeArRay.

6
ответ дан 27 November 2019 в 01:06
поделиться

Вот наименее питонический способ:

out = ""
for x in range(len(lst)):
  for y in range(len(lst)):
    if x + y == len(lst)-1:
        out = lst[y] + out
7
ответ дан 27 November 2019 в 01:06
поделиться

Отличный ответ от Silenghost, но, просто несколько слов о представленном , уменьшают «Альтернатива»

, если у вас не очень очень очень очень , хорошая причина к объединенным строкам + или Operator.add (самый частый, что у вас есть немного, фиксированное количество строк), вы должны использовать всегда . Присоединяйтесь к .

То, что каждый + + генерирует новую строку, которая является конкатенацией двух строк, если только присоединится только, что генерирует одну конечную строку. Итак, представьте, что у вас есть 3 строки:

A + B + C
-->
D = A + B
final = D + C

Хорошо, не кажется не сильно, но вы должны зарезервировать память для D. Кроме того, с учетом использования строк Python, генерируя новый, промежуточный, строку, это Как-то дорого ...

Теперь, с 5 строками

A + B + C + D + E
-->
F = A + B
G = F + C
H = G + D
final = H + E

, при условии, что лучшее сценарию (если мы сделаем (A + B) + (C + D) + E, мы закончим иметь три промежуточных строки одновременно В памяти), которые генерируют 3 промежуточных струны ... Вы должны создать новый объект Python, резервное пространство памяти, отпустите память несколько раз ... Также накладные расходы на вызов функции Python (это не маленький)

Теперь подумайте об этом с 200 струнами. Мы в конечном итоге со смешным большим количеством промежуточных струн, каждый из которых потребляет довольно много времени, будучи полный список по поводу Python, а также называть много функций . Addd функций, каждый с его Наверху ... Даже если вы используете Уменьшите функции , это не поможет. Это проблема, которая должна управляться с другим подходом: присоединиться к , которое только генерирует , один полная строка Python, окончательный и вызывает одну функцию Python.

(Конечно, Присоединяйтесь или другие подобные, специализированные функции для массивов)

4
ответ дан 27 November 2019 в 01:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: