3

有没有办法简化这个循环,我用破折号替换列表中每个项目的空格?

for item in a_list:
    alist[alist.index(item)] = '-'.join(item.split(" "))

还是这样更好?

for item in a_list:
    alist[alist.index(item)] = item.replace(" ", "-")

注意:上述解决方案仅更新此列表中的第一次出现,正如 David 建议的那样,使用列表推导来完成上述任务。

我有一个单词列表,有些有破折号,有些没有。a_list 中的项目如下所示:

this-item has a-dash
this has dashes
this should-have-more dashes
this foo
doesnt bar
foo
bar

输出应该是这样的,列表中的所有项目都应该有破折号而不是空格:

this-item-has-a-dash
this-has-dashes
this-should-have-more-dashes
this-foo
doesnt-bar
foo
bar
4

2 回答 2

7

使用列表推导:

a_list = [e.replace(" ", "-") for e in a_list]
于 2012-09-18T23:39:37.580 回答
2

当您发现自己使用该index方法时,您可能做错了什么。(并非总是如此,但经常足以让您考虑一下。)

在这种情况下,您正在按顺序迭代列表,并且您想知道当前元素的索引。反复查找它很慢(它使 O(N) 算法 O(N^3))——但更重要的是,它很脆弱。例如,如果您有两个相同的项目,索引将永远找不到第二个。

这正是enumerate创建的目的。所以,这样做:

for i, item in enumerate(a_list):
    alist[i] = '-'.join(item.split(" "))

同时,您可以用列表推导替换循环:

a_list = ['-'.join(item.split(" ")) for item in a_list]

这可能会更慢或使用更多内存(因为您正在复制列表而不是就地修改它),但这几乎肯定无关紧要(它肯定不会像您的原始代码那么慢),并且不可变算法更简单、更容易推理——也更灵活;您可以使用元组或任意迭代来调用此版本,而不仅仅是列表。

作为另一项改进,您真的需要split然后join,还是可以只使用replace

a_list = [item.replace(" ", "-") for item in a_list]

您可以改用正则表达式,这在某些类似情况下可能会更好地提高性能或可读性——但我认为在这种情况下实际上会更糟。所以,一旦你到达这里,你就完成了。

于 2012-09-19T00:13:04.587 回答