我正在寻找一种最有效的方法来将一个元素添加到逗号分隔的字符串,同时保持字母的字母顺序:
例如:
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'
非常感谢示例代码。非常感谢。
对于第一种情况:
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=
,所以第二种情况下的额外复杂性将是惊人的,甚至可能甚至没有给你任何表现。
只有当整个应用程序的配置文件显示此操作是它的一个关键瓶颈时,才能考虑上一段中提到的优化类型(如果是这样,通过将此数据结构保持为一个,您将获得更快的速度)单词列表,', '
- 仅在出于输出目的而需要加入它时,而不是为可能需要进行此类优化的极长列表分割和重新加入成千上万次。
您确定要将数据存储为字符串吗?
维护一个集合或列表(或者,在第二种情况下,一个字典)并在需要时生成字符串可能更有意义。如果数据不经常更改,请缓存字符串。
对于使用字符串作为主要数据存储的任何解决方案,您可能最终会生成一个临时列表,以便更容易插入元素 - 因此保留列表更有意义。
这是一种做你想做的事情的方法:
>>> ", ".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'
我故意忽略了你要求“最有效”的做事方式的部分问题。证明算法是解决特定问题的最有效方法是未解决的计算机科学问题。它根本不可能完成,当然也没有当前的技术。
但是,如果您担心效率,则应该存储中间数据结构,而不是对字符串进行这些操作;任何基于字符串的操作都会浪费大量时间来复制内存;您应该只在完成所有处理后转换为字符串和从字符串转换。
我想一个简单的解决方案是:
result = string + ',' + addition