Эффективный способ в Python добавить элемент в строку через запятую - PullRequest
2 голосов
/ 20 мая 2010

Я ищу наиболее эффективный способ добавить элемент в строку через запятую, сохраняя при этом алфавитный порядок слов:

Например:

string = 'Apples, Bananas, Grapes, Oranges'
addition = 'Cherries'
result = 'Apples, Bananas, Cherries, Grapes, Oranges'

Кроме того, способ сделать это, но с сохранением идентификаторов:

string = '1:Apples, 4:Bananas, 6:Grapes, 23:Oranges'
addition = '62:Cherries'
result = '1:Apples, 4:Bananas, 62:Cherries, 6:Grapes, 23:Oranges'

Пример кода с благодарностью. Большое вам спасибо.

Ответы [ 4 ]

8 голосов
/ 20 мая 2010

Для первого случая:

alist = string.split(', ')
result = ', '.join(sorted(alist + [addition]))

Для второго случая:

alist = string.split(', ')
result = ', '.join(sorted(alist + [addition],
                          key=lambda s: s.split(':', 1)[1]))

Если в списке много тысяч элементов, первый случай может показать измеримое улучшение производительности, если вы готовы пойти на гораздо большее осложнение bisect.insort ; но это не поддерживает key=, поэтому дополнительные сложности во втором случае будут ошеломляющими и, вероятно, даже не принесут вам никакой производительности.

Вид оптимизации, упомянутый в последних параграфах, стоит рассмотреть, только если профиль всего вашего приложения показывает, что эта операция является критическим узким местом для нее (и если это так, вы получите гораздо большую скорость, сохраняя эти данные структурировать как список слов, ', ' - объединяя его только по мере необходимости, предположительно для целей вывода, а не разделяя и объединяя тысячи и тысячи раз для вида очень длинных списков, где такая оптимизация может быть оправдана). *

3 голосов
/ 20 мая 2010

Вы уверены, что должны хранить данные в виде строки?

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

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

2 голосов
/ 20 мая 2010

Вот один из способов сделать то, что вы хотите:

>>> ", ".join(sorted('Apples, Bananas, Grapes, Oranges'.split(", ") +
...                  ["Cherries"]))
'Apples, Bananas, Cherries, Grapes, Oranges'

и «при сохранении идентификаторов»:

>>> ", ".join(sorted('1:Apples, 4:Bananas, 6:Grapes, 23:Oranges'.split(", ") + 
...                  ["62:Cherries"], key=lambda x: x.split(":")[1]))
'1:Apples, 4:Bananas, 62:Cherries, 6:Grapes, 23:Oranges'

Я намеренно игнорирую ту часть вопроса, где вы задали вопрос о «наиболее эффективном» способе сделать что-то. Доказательство того, что алгоритм является наиболее эффективным из возможных подходов к конкретной проблеме, является нерешенной проблемой информатики. Это может быть невозможно вообще, и, конечно, для этого нет современных методов.

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

0 голосов
/ 16 января 2018

Полагаю, простое решение было бы:

result = string + ',' + addition   
...