在Python中高效地向逗号分隔字符串添加元素的方法

2 投票
4 回答
3657 浏览
提问于 2025-04-15 22:55

我在寻找一种最有效的方法来往一个用逗号分隔的字符串中添加一个元素,同时保持这些单词的字母顺序:

比如说:

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

另外,还有一种方法可以做到这一点,同时保持ID:

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

如果能提供一些示例代码,那就太好了。非常感谢。

4 个回答

2

这里有一种方法可以实现你想要的效果:

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

还有“保持ID不变”的部分:

>>> ", ".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'

我故意不提你问的“最有效”的方法。证明一个算法是解决特定问题的最有效方法,这在计算机科学中是一个未解决的问题。可能根本就无法做到,而且目前也没有任何技术可以做到这一点。

不过,如果你关心效率的话,建议你存储中间数据结构,而不是在字符串上进行这些操作;任何基于字符串的操作都会浪费很多时间在内存复制上;你应该在所有处理完成后再进行字符串的转换。

3

你确定要把数据存储为字符串吗?

其实,保持一个集合或列表(或者在你第二种情况下,用字典)可能更合理,等需要的时候再生成字符串。如果数据不经常变化,可以把字符串缓存起来。

如果你用字符串作为主要的数据存储,最后可能还得生成一个临时列表来方便插入元素,所以直接保持列表会更简单。

8

对于第一种情况:

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= 参数,所以在第二种情况下的额外复杂性会非常高,可能根本不会提升性能。

最后提到的那些优化,只有在你整个应用的性能分析显示这个操作是个关键瓶颈时才值得考虑。如果真的是这样,你通过保持这个数据结构为一个单词列表,只有在需要输出时才用 ', ' 连接,可能会获得更大的速度提升,而不是为了那些极长的列表而反复拆分和重新连接,进行那些可能有意义的优化。

撰写回答