在Python中,针对列表中的每个项,在一个字符串前添加另一个字符串。

8
我有一个网站列表的字符串,我正在用for循环将“http”添加到前面,如果第一个索引不是“h”,但当我返回时,列表没有改变。
n是我的网站列表 h是“http”。
for p in n:
    if p[0]!="h":
        p= h+ p
    else:
        continue
return n

当我返回列表时,它返回我的原始列表,并且没有添加“http”。有人能帮帮我吗?


如果您的列表中有以“h”开头但不是“http”的网站,那么可能需要检查第一个字符之后的内容。 - hexparrot
4个回答

15
这也可以使用列表推导式完成:
n = [i if i.startswith('h') else 'http' + i for i in n]

3

您需要重新分配列表项 -- 字符串是不可变的,因此 += 会创建一个新字符串,而不是改变旧字符串。例如:

for i, p in enumerate(n):
  if not p.startswith('h'):
    n[i] = 'http' + p

0
n = [{True: '', False: 'http'}[p.startswith('h')] + p for p in n]

不要真的这样做。虽然它确实可以工作。


2
可能是因为这是一种有趣的hacky方式来完成它。 - Max Shawabkeh
仅供参考:现在Python有if-else表达式了,所以不再需要使用字典/序列/and-or的hack来模拟它们。可以查看Max S.的答案来获取一个去除hack的版本。 - Laurence Gonsalves
@Laurence:他们与 C 三元运算符相比的“乱序”使我避免使用它们,因为我不希望来自其他语言的经验不足的 Python 程序员在处理它们时跌倒。虽然这并不是将其替换为字典的理由... - Ignacio Vazquez-Abrams

0
>>> n=["abcd","http","xyz"]

>>> n=[x[:1]=='h' and x or 'http'+x for x in n]

>>> n
['httpabcd', 'http', 'httpxyz']

将会因为空字符串而失败。但希望这种情况不会太多。 - Ignacio Vazquez-Abrams
你试过了吗? :-) 对于这种情况,使用[:1]代替[0] - YOU
不,我以为逻辑有问题,但在这种特定情况下我错了。如果条件是 x[:1]!='h' 那么它就会失败。 - Ignacio Vazquez-Abrams
是的 :-) 这就是 and or 的工作原理,正如您所知道的那样,我故意使用 =='h' 来避免 '' 进入 and 部分。 - YOU

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接