如何在Python列表中的每个其他项中添加文本?

9

我有一个列表,类似于:

mylist = ["1", "2", "3", "4", "5"]

我想要在每个其他项目中添加一些文本,使其看起来像这样:

mylist = ["1a", "2", "3a", "4", "5a"]

我写了这个代码,它可以正常地应用于每一个项目。但是如何让它只应用于每隔一个项目呢?

mylist2 = ["a" + item for item in mylist]

3
“a” 应该放在数字之前还是之后?你的列表推导式与你想要的不一致。 - Omkar Neogi
我实际上想知道如何将它放在任一侧,但是一旦我有了一个解决方案,我可以尝试更改顺序来移动它。 - Alligator
“每个项目”和“每隔一个项目”有什么区别? - hellow
5个回答

10

有一个方法可以实现这个需求:

mylist = ["1", "2", "3", "4", "5"]
res = [x + ('a' if i%2 == 0 else '') for i, x in enumerate(mylist)]

导致结果如下:

['1a', '2', '3a', '4', '5a']

该方法利用的是当你想要更改的术语的索引除以2的余数为1的事实。请参见 模运算

3
恭喜你回答正确。我不喜欢的是你添加了一个空字符串,而没有在整个表达式上使用三元运算符。在这里可以避免添加空字符串。 - Jean-François Fabre
@Jean-FrançoisFabre 同样的想法也在我脑海中浮现过,但是我得出的结论是它同样快速和高效。如果不是这样的话,我非常好奇并感激知道原因。 - Ma0
1
因为 x + '' 会生成另一个字符串,而不是直接使用 x。对于小列表可能不太明显。 - Jean-François Fabre
1
有趣的是,x+'' is x 返回 True - Ma0
这是由于字符串内部化的原因。我认为在向 "" 添加内容时有一种优化。 - Jean-François Fabre
显示剩余3条评论

10

试试这个:

for i in range(0, len(mylist), 2):
    mylist[i] = mylist[i] + "a"

编辑1:

for i in range(0, len(mylist), 2):
    mylist[i] += "a"

6
使用enumerate和模运算来使用三元表达式测试奇偶数值。
mylist = ["1", "2", "3", "4", "5"]
mylist2 = [item if i%2 else "a" + item for i,item in enumerate(mylist)]

结果:

>>> mylist2
['a1', '2', 'a3', '4', 'a5']

要获得1a等等,只需将"a" + item替换为item + "a"


问题在于列表不一定以奇数开头... 我宁愿使用 mylist2 = [item if not int(item)%2 else "a" + item for item in mylist] - Tony Pellerin
@TonyPellerin,这不是关于列表的值,而是元素的索引。OP的例子是误导性的。该列表可以是['a','b','c'] - Jean-François Fabre

4

一种有点奇怪的解决方案,它利用了迭代器:

>>> from itertools import cycle
>>> mylist = ["1", "2", "3", "4", "5"]
>>> suffix = cycle(["a", ""])
>>> [l + s for l, s in zip(mylist, suffix)]
['1a', '2', '3a', '4', '5a']

编辑

正如Netwave在评论中建议的那样,这里提供了非常Pythonic的解决方案!

>>> import itertools, operator
>>> list(map(operator.add, mylist, itertools.cycle(("a", ""))))
['1a', '2', '3a', '4', '5a']

3
我们这里喜欢奇怪的东西。 - Jean-François Fabre
1
再来一个小技巧:map(operator.add, mylist, cycle(("a", ""))) - Netwave
1
@Netwave:超级Python化的解决方案! - Don

0

mylist = ["1", "2", "3", "4", "5"] text_list = [str(x) + 'a' if i % 2 == 0 else x for i, x in enumerate(mylist)]

mylist = ["1", "2", "3", "4", "5"] text_list = [str(x) + 'a' if i % 2 == 0 else x for i, x in enumerate(mylist)]


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