Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用破折号替换列表中每个项目的空格-python_Python_Whitespace_Replace - Fatal编程技术网

用破折号替换列表中每个项目的空格-python

用破折号替换列表中每个项目的空格-python,python,whitespace,replace,Python,Whitespace,Replace,有没有一种方法可以简化这个循环,用破折号替换列表中每个项目的空格 for item in a_list: alist[alist.index(item)] = '-'.join(item.split(" ")) 还是这样更好 for item in a_list: alist[alist.index(item)] = item.replace(" ", "-") 注意:上述解决方案仅更新此列表中的第一次出现,正如David建议的那样,使用列表理解来完成上述任务。 我有一个单词

有没有一种方法可以简化这个循环,用破折号替换列表中每个项目的空格

for item in a_list:
    alist[alist.index(item)] = '-'.join(item.split(" "))
还是这样更好

for item in a_list:
    alist[alist.index(item)] = item.replace(" ", "-")
注意:上述解决方案仅更新此列表中的第一次出现,正如David建议的那样,使用列表理解来完成上述任务。

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

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

使用列表理解:

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

当您发现自己在使用
index
方法时,您可能做错了什么。(不一定,但要经常考虑。)

在本例中,您正在按顺序迭代一个列表,并且希望知道当前元素的索引。反复查找它是很慢的(它会生成一个O(N)算法O(N^3))-但更重要的是,它很脆弱。例如,如果有两个相同的项,索引将永远找不到第二个项

这正是创建枚举的目的。因此,请这样做:

for i, item in enumerate(a_list):
    alist[i] = '-'.join(item.split(" "))
同时,您可以使用列表替换循环:

a_list = [e.replace(" ", "-") for e in a_list]
a_list = ['-'.join(item.split(" ")) for item in a_list]
这可能会更慢或使用更多内存(因为您是在复制列表,而不是在原地修改),但这几乎肯定不重要(它肯定不会像原始代码那样慢),而且不可变算法更简单、更容易推理,也更灵活;您可以使用元组或任意iterable调用此版本,而不仅仅是列表

作为另一项改进,您真的需要
拆分
,然后
加入
,还是可以使用
替换

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

您可以使用正则表达式,在一些类似的情况下,正则表达式在性能或可读性方面可能更好,但我认为在这种情况下,它实际上会更差。因此,一旦你到了这里,你就完成了。

如果列表中有重复的项,那么这两种解决方案都不会起作用,因为
。index
返回项的第一个索引。jamylak注意到,david的列表理解解决方案是操纵列表的Python方法,尽管使用列表理解更为Python,而且通常更为简单,更灵活的是,您仍然需要了解如何在不出现
索引问题的情况下操作列表,因为在某些情况下会出现问题。@jamylak:实际上,在这种情况下
索引
。一旦多个副本中的第一个副本被更改一次,以后的副本将不会尝试替换它(或者更准确地说,如果他们确实尝试替换它,这意味着复制字符串中从来没有任何空格)。所以这是一个罕见的情况,
索引
会起作用(尽管它仍然不是最好的解决方案!!)@DavidRobinson啊,我看你是对的